最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析C/C++指針、函數、結構體、共用體

 更新時間:2022年01月23日 12:27:53   作者:夢中的拉布拉多  
這篇文章主要介紹了C/C++指針、函數、結構體、共用體的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

指針

變量與地址

變量給誰用的?
變量是對某一塊空間的抽象命名。
變量名就是你抽象出來的某塊空間的別名。
指針就是地址。指向某個地址。

指針與指針變量

指針是指向某塊地址。指針(地址)是常量。
指針變量是可以發(fā)生變化的。

#include <stdio.h>

int main()
{
    int i = 1;
    int *p = &i;
    
    printf("i = %d  \n", i);
    printf("&i = %p \n", &i);
    printf(" p = %p \n", p);
    printf("&p = %p \n", &p);
    printf("*p = %d \n", *p);
    // 為什么不用char* p = &i;
    //TYPE  NAME = VALUE
    //int*  p    = &i;
    //int   i    = 1;
}

直接訪問間接訪問

占內存空間

都是8字節(jié),linux 64 位中。

空指針 野指針 空類型

int * i= NULL;

指針運算

兩個指針同時指向一個數組。++ 、--、比較、關系、&、*

指針與一維數組

數組名和 指針的區(qū)別?
a是數組名字是一個表示地址的常量。
指針是一個變量。
a++;
p++;

#include <stdio.h>

int main()
{
    int a[3] = {1,2,3};
    int *p = a;
    int i;
    for(i = 0;i < sizeof(a)/sizeof(*a); i++) {
        printf("%d %d %d %d \n",a[i],*(a+i),p[i],*(p+i)); // a[i]
        printf("%p %p %p %p \n",a+i, &a[i],p+i, p+i); // &a[i]
    }
    printf("\n");
}

這里代碼體現什么是指針常量什么是指針變量?

#include <stdio.h>

int main()
{
    int a[3];
    int i;
    int *p = a;
    for(i = 0;i < sizeof(a)/sizeof(*a); i++) {
        printf("%p -> %d\n",&a[i],a[i]);
    }
    for(i = 0;i <sizeof(a)/sizeof(*a); i++) {
        scanf("%d",p++);
    //p = a;
    for(i = 0;i < sizeof(a)/sizeof(*a); i++,p++) {
        printf("%p -> %d\n",p,*p);
    printf("\n");
}

指針與二維數組

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[2][3] = {1,2,3,4,5,9};
    int i,j;
    int *p;
//(W)    p = a; 
    //wall等號右邊a是在行間跳轉的指針
    // 等號左邊是列間跳轉的指針
    p = *(a+0);
    //p = &a[0][0];//*(a+0),*a;
    printf("%p->%p \n", a, a + 1);
    // printf("%p -> %d \n\n",p,*p);
    
   
    // for(i = 0; i < 6; i++,p++) {
    //     printf("%d ",*p);
    // }
    // printf("\n");
    for(i = 0;i < 2; i++) {
        for(j = 0; j < 3; j++) {
            printf("%p->%d\n",&a[i][j],a[i][j]);
            printf("%p->%d\n",*(a+i)+j,*(*(a+i)+j));
            //printf("%p->%d\n",a[i]+j,*(*(a+i)+j));
            //printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    exit(0);
}

指針與字符數組

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 字符指針和字符數組之間的使用
// 
// 練習 定義數組后定義指針 后面操作都用指針實現
int main()
{
#if 0
    char* str = "hello"; // "hello" 串常量
    printf("%d %d \n",sizeof(str),strlen(str));// 8 5
    //strcpy(str,"world"); //err 為什么不可以?區(qū)分字符指針和字符數組的區(qū)別  :企圖用"world" 覆蓋串常量 
    str = "world";
    puts(str);
#endif 
    char str[] = "hello";
    printf("%d %d \n",sizeof(str),strlen(str));// 6 5
// (F) str = "hhhh"; // 數組名是一個地址常量怎么可能放到等號左邊???
    strcpy(str,"jjjj");
    char str[] = "hello  world";
    char *p = str + 7;
    puts(p);
    exit(0);
}

const與指針

#include <stdio.h>
#include <stdlib.h>
/*
    常見const 
    const int a;
    int const a;

    const int *p; // 常量指針 
    int const *p;
    int *const p; // 指針常量
    const int *const p;
    define 不檢查語法
*/
int main()
{
    #if 0
        // cosnt修飾常規(guī)變量的使用特點
        // 這個警告已經構成error
        const float pi = 1.14159;
        // pi = 9999.2;
        float *p = &pi; // initialization discards ‘const' qualifier from pointer target type [enabled by default]
        *p = 1223.333333; 
        // 修改方法 const float *p = &pi; 
        printf("%f\n",pi); // 1223.333333
        printf("%f\n",*p);
    #endif
    // 常量指針:指針的指向可以發(fā)生變化但是指針所指向的目標值是不能變化的
    // const  *p
    // 值不能變
    // 指向可以發(fā)生變化
    
    int i = 1;
    const int *p1 = &i;
    int j = 88;
//T    i= 10;   
//F    *p1 = 99;
//T    p1 = &j;
    printf("%d\n",i);
    printf("%d\n",*p1);
    // 指針常量:指針的指向不能發(fā)生變化,指針所指向的目標變量的值可以發(fā)生變化。
    int j= 100;
    int * const p1 = &i;
//T    *p1 = 10;
//F     p1 = &j;
    //const 左右都有 指向和值都不能變
    int num = 10;
    const int* const p3 = &num;
    // *p3 = 99;
    // p3 = &i;
    exit(0);
}

指針數組和數組指針的區(qū)別

數組指針

#include <stdio.h>
#include <stdlib.h>
/*
    數組指針: [存儲類型] 數據類型 (* 指針名) [下標] = 值;
    int (*p)[3]; -> type name; -> int[3] *p;
*/
int main()
{
    // 數組指針
    int a[2][3] = {1,2,3,4,5,9};
    int i,j;
    int *p = *a;
    int (*q)[3] = a;
    //printf("%d \n", *a); // a[0][0]的地址
    //printf("%d \n", **a); //1
    #if 0
    // printf("%d \n",*p);//q
    //int *p = *a;
    //printf("%d \n",*p); //q
    // int (*q)[3] = a+1;
    // printf("%d \n",**q); // 4
    printf("\n");
    for(i = 0;i < 2; i++) {
        for(j = 0; j < 3; j++) {
            // printf("%p->%d\n",*(a+i)+j,*(*(a+i)+j));
            printf("%p->%d\n",*(q+i)+j,*(*(q+i)+j));
        }
        printf("\n");
    }
    #endif 
}

指針數組:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
    int *arr[3]; -> TYPE NAME; -> int *[3] arr;

*/
int main()
{
    char *name[5] ={"english","math","cpp","teacher","computer"};
    int i,j;
    for(i = 0; i < 5; i++) {
        puts(name[i]);
    }
    
    for(i = 0; i < 5 ;i++) {
        int k = i;
        for(j = i+1;j < 5; j++) {
            if(strcmp(name[k],name[j]) > 0) {
                k = j;
            }
        }
        if(k != i) {
            char *tmp = name[i];
            name[i] = name[k];
            name[k] = tmp;
        
    printf("排序后:\n");
    exit(0);
}

指針和函數

函數:

echo $? // 顯示上個命令的返回值

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

/*
	定義: 
	int a[N] = {1,2,3,4,5,6};
	int *p = a; 
	
->    a     *a    a[0]    &a[3]   p[i]   p     *p   p+1
->	  int*	int   int 	  int *	  int    int*  int  int*
  
*/
//void func1(int *a,int n)
void func1(int* a,int n,int *b)
{
	cout << "== b =" << *b<< endl; // 1
	for(int i = 0;i < n; i++)
	{
		printf("%d ",*(a+i));
	}
	printf("\n");
	return ;
}
int main(int argc, char** argv) {
	int arr[3] = {1,2,3};
	func1(arr,3,&arr[1]);//&(*(ar+1))
	return 0;

用指針與一維數組的使用:

void func2(int *p,int n)
{
	int m = n / 2;
	for(int i = 0;m--;i ++)
	{
		int j = n - i -1;
		int tmp = *(p+i);
		*(p+i) = *(p+j);
		*(p+j) = tmp;
	}
}
int main(int argc, char** argv) {
	int arr[] = {1,2,3,6,4,2,38,4,2,23};
	
	//func1(arr,3,&arr[1]);//&(*(ar+1))
	func2(arr,10);
	for(int i = 0;i < 10;i ++)
		cout << arr[i] << ' ' ;
	cout <<endl;
	return 0;

函數與二維數組:

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

/*
	int a[M][N] = {......};
	int *p = a;
	int (*q)[N] = a;
	
->    a[i][j]    *(a+i)       a[i]+j    p[i]        *p
	  int        int *        int *     int         int
	  
->    q[i][j]    *q           q             p+3         q+2
	   int       int*         int(*)[N]     int *        int (*)[N]
*/
void func(int *p,int n)
{
	for(int i = 0;i < n; i++)
	{
		cout << *p << ' ';
		p++;
	}
}
void print_arr(int (*p)[3])
	for(int i = 0;i < 3;i++)
		for(int j = 0;j < 3;j++)
		{
			cout << *(*(p+i)+j) << ' ';
		}
		cout<< endl;
int main(int argc, char** argv) {
	int arr[3][3] = {1,2,3,6,4,2,38,4,2};
	func(arr[0],9); // *arr &arr[0][0]  arr[0]
	//  這里func(arr,9)  形參是int *p 就報錯  p是一個列指針,二維數組不一樣 
	print_arr(arr);
	return 0;

案例使用二維數組傳參

float average_score(int *a,int n)
{
	float sum = 0.0;
	for(int i = 0;i < n; i++)
	{
		sum += *(a+i);
	}
	
	return sum/n;
}
void find_num(int(*p)[3],int num)
{
	for(int i = 0;i < 3 ;i++)
		printf("%d ",*(*(p+num) + i));
	cout << endl;
	return ;
}
int main(int argc, char** argv) {
	int arr[3][3] = {1,2,3,6,4,2,38,4,2};
	
	float ave = 0.0;
	ave = average_score(*arr,9);
	printf("%f \n",ave);
	
	find_num(arr,0);
	
	
	return 0;
}

函數與指針關系的詳細剖析

指針函數

返回值 * 函數名(參數)

#if 0
void find_num(int(*p)[3],int num)
{
	for(int i = 0;i < 3 ;i++)
		printf("%d ",*(*(p+num) + i));
	cout << endl;
	return ;
}
#else 
int * find_num(int(*p)[3],int num)
	return 	*(p+num);
#endif
int main(int argc, char** argv) {
	int arr[3][3] = {1,2,3,6,4,2,38,4,2};
	
	float ave = 0.0;
	ave = average_score(*arr,9);
	printf("%f \n",ave);
	int * res;
	res = find_num(arr,0);
	if(res != NULL)
	{
		for(int i = 0;i < 3;i++)
			printf("%d ",res[i]);
		cout <<endl;
	}
	else 
		printf("can not find\n");
	return 0;

函數指針

#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a+b;
} 
int sub(int a,int b)
{
	return a-b;
}
int main(int argc, char** argv) 
{
	int a = 2, b = 3;
	int (*p)(int,int);
	int (*q)(int,int);
	
	int ret;
	p = add;
	q = sub;
		
	printf("%d \n",p(a,b));
	printf("%d \n",q(a,b));
	
	return 0;
}

回調函數

函數指針數組

類型 (*數組名[下標])(形參);

#include <iostream>
using namespace std;

int add(int a,int b)
{
	return a+b;
} 
int sub(int a,int b)
{
	return a-b;
}
int main(int argc, char** argv) 
{
	int a = 2, b = 3;
	int (*funcp[2])(int,int);
	
	int ret;
	funcp[0] = add;
	funcp[1] = sub;
		
	for(int i = 0;i < 2; i++)
	{
		ret = funcp[i](a,b);
		printf("%d \n",ret);
	}
		
	return 0;
}

指向指針函數的函數指針數組
數組存放指針,指針指向函數,函數返回值是指針類型。

結構體

  • 產生的意義
  • 類型描述
  • 嵌套定義
  • 定義變量、初始化及引用
  • 占用內存大小

定義和使用:

#include <iostream>
using namespace std;

#define NAMESIZE 100
struct simp_st 
{
	int i,j;
	float f;
	char ch;	
};
struct birthday_st
	int year,month,day;
struct student_st
	int id;
	char name[NAMESIZE];
	struct birthday_st birthday;
	int math;
	int chinese;
int main(int argc, char** argv) 
	
	struct student_st stu = {10011,"Alan",{3011,22,11},22,54};
	struct student_st *p = &stu;
	printf("%d %s %d-%d-%d %d %d \n",stu.id,stu.name,stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.math,stu.chinese);	
	printf("%d %s %d-%d-%d %d %d \n",p->id,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->math,p->chinese);
	struct student_st stu[2] = {{10011,"Alan",{3011,22,11},22,54},{10012,"salay",{2021,2,12},88,66}};
	struct student_st *p = &stu[0];// &stu[0]  stu
	for(int i = 0;i < 2;i++,p++)
	{
		printf("%d %s %d-%d-%d %d %d \n",p->id,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->math,p->chinese);
	}
	return 0;
}

內存對齊問題
addr/sizeof()

構造類型-結構體內存問題及函數傳參

為后面linux高級鋪墊。

  • 可以實現一個學生管理系統。
  • 產生及意義
  • 類型描述
  • 嵌套定義
  • 定義變量
  • 占用內存大小
  • 函數傳參
  • 位域
union 名{
	數據類型 成員名1;
	數據類型 成員名2;
};

枚舉類型

enum 名{
	成員1;
	成員2;
	成員3;
}

到此這篇關于C/C++指針、函數、結構體、共用體的文章就介紹到這了,更多相關C++指針 函數 結構體 共用體內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現學生信息管理程序

    C語言實現學生信息管理程序

    這篇文章主要為大家詳細介紹了C語言實現學生信息管理程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 哈夫曼的c語言實現代碼

    哈夫曼的c語言實現代碼

    著先通過 HuffmanTree() 函數構造哈夫曼樹,然后在主函數 main()中自底向上開始(也就是從數組序號為零的結點開始)向上層層判斷,若在父結點左側,則置碼為 0,若在右側,則置碼為 1。最后輸出生成的編碼
    2013-07-07
  • C語言線性表之雙鏈表詳解

    C語言線性表之雙鏈表詳解

    這篇文章主要為大家詳細介紹了C語言線性表之雙鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • VisualStudio2022配置opencv的實現

    VisualStudio2022配置opencv的實現

    本文主要介紹了VisualStudio2022配置opencv的實現,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • C++實現水仙花數判斷實例

    C++實現水仙花數判斷實例

    大家好,本篇文章主要講的是C++實現水仙花數判斷實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C/C++中組合詳解及其作用介紹

    C/C++中組合詳解及其作用介紹

    這篇文章主要介紹了C/C++中組合的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 關于C語言函數strstr()的分析以及實現

    關于C語言函數strstr()的分析以及實現

    以下是對C語言中strstr()函數的使用進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 解析OpenSSL1.1.1?centos7安裝編譯aes的c++調用

    解析OpenSSL1.1.1?centos7安裝編譯aes的c++調用

    這篇文章主要介紹了OpenSSL1.1.1?centos7安裝編譯aes的c++調用,實現方法也很簡單,主要是在該文檔內加入openssl的lib路徑,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Qt利用QPainter實現基本繪圖的示例詳解

    Qt利用QPainter實現基本繪圖的示例詳解

    Qt?中提供了強大的?2D?繪圖系統,可以使用相同的?API?在屏幕和繪圖設備上進行繪制,它主要基于QPainter、QPaintDevice?和?QPaintEngine?這三個類。本文主要和大家介紹一下QPainter實現的基本繪圖,感興趣的可以了解一下
    2022-12-12
  • 算法之排序算法的算法思想和使用場景總結

    算法之排序算法的算法思想和使用場景總結

    這篇文章主要介紹了算法之排序算法的算法思想和使用場景總結,本文講解了插入排序、交換排序、選擇排序等幾大類排序算法的特點、思想和使用場景,需要的朋友可以參考下
    2014-08-08

最新評論

营山县| 博野县| 呼伦贝尔市| 东辽县| 肇庆市| 区。| 吉林省| 大庆市| 太仆寺旗| 大港区| 务川| 弥勒县| 资中县| 安化县| 淳安县| 太仆寺旗| 于田县| 大方县| 临邑县| 平潭县| 彩票| 景洪市| 洞头县| 略阳县| 临清市| 崇左市| 兴文县| 朝阳县| 北碚区| 滕州市| 墨玉县| 姜堰市| 开江县| 页游| 蕲春县| 丹凤县| 五原县| 中山市| 吴忠市| 乌兰察布市| 左贡县|