提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、C语言中的地址
1.地址的概念:
我们在创建变量或数组时,系统会为我们申请相对应的地址并开辟空间来存储变量的值,而地址就是指向存储变量空间的一串八个数字的十六进制数。我们可以将存储变量的值的空间看做是房子,而地址是门牌号。
2.画图理解地址
int类型的变量
int数组类型
数组的首地址指向数组的首个元素的地址,他们在数值上是相同的但并不是一个东西。
二、变量指针:
1.变量指针的概念
变量指针类似于变量,只不过其类型为指针类型,我们可以将变量指针看做指针类型的变量,只不过该变量用于存储地址,例如int a = 100;&a就是一个指针,其指向变量a的地址。
2.变量指针的定义
//1.先定义在复制
int a = 100;
int *p = NULL;
p = &a;
//2.在定义时赋值
int *q = &a;
3.变量指针的使用:
int a = 100;
int b = 300;
int *p = &a;
int *q = &b;
//1.利用变量指针输出所指向对象的值,p表示地址,*p表示内容。
printf("a=%d,b=%d\n", *p, *q);
//2.改变指针的指向
p = &b;//将指针p指向b的地址
q = &a;//将指针q指向a的地址
printf("a=%d,b=%d\n", *q, *p);
//通过指针改变a,b的内容。
*p = 500;//将b的值改为500
*q = 100;//将a的改为100
printf("a=%d,b=%d\n", *q, *p);
//输出指针的大小,指针是固定长度为8个字节。
printf("%d,%d\n", sizeof(p),sizeof(q));
//*p,*q所占字节的大小与其指向变量的类型有关,int类型为4个字节。
printf("%d,%d\n", sizeof(*p), sizeof(*q));
//通过指针输出指向变量的地址
printf("%p,%p", q, p);
4.指针的加减运算
int a = 100;
int *p = &a;
//指针可以进行加减运算,每次加减一个单位(该单位与其指向的变量类型有关)。
//这里p+1=>一次加4个字节的长度。
int *k = p+2;//p向上移动二个单位(八个字节)。
int *m = p-3;//p向下移动三个单位(三个字节)。
画图理解指针的加减运算:
三、数组指针
概念:数组指针本质上是指针,该指针存入的是数组的地址。
1.一维数组的数组指针
int a[5] = {1,2,3,4,5};
int *p = a;//a为数组名,在这里为数组的首地址
//利用指针输出数组a的元素值
printf("%d\n", *p);
printf("%d\n", *(p+1));
printf("%d\n", *(p+2));
printf("%d\n", *(p+3));
printf("%d\n", *(p+4));
//p表示数组a的首地址,则p[0] <=> a[0]
printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);
printf("%d\n", p[3]);
printf("%d\n", p[4]);
//p还满足交换律,p[0] => *(p+0) => *(0+p) =>0[p]
printf("%d\n", 0[p]);
printf("%d\n", 1[p]);
printf("%d\n", 2[p]);
printf("%d\n", 3[p]);
printf("%d\n", 4[p]);
//利用指针p输出数组各个元素的地址,指针像地址一样可以加减运算
printf("%p\n", p);
printf("%p\n", p+1);
printf("%p\n", p+2);
printf("%d\n", p+3);
printf("%d\n", p+4);
2.二维数组的数组指针
int a[3][4] = {{1,2,3,4},{10,20,30,40},{11,22,33,44}}
//优先级() >[] > *
/*数组指针本质上是指针,我们可以拆分来看(*p)表示该变量是一个指针,int[3]表示该指针指向int[3]类型的地址,本次案例指向地址a[0],也就是a数组的首元素的地址。*/
int (*p)[3] = a;
// 练习通过p将 2,10,40,33,44打印出来
printf("%d\n", p[0][1], (*p)[1], *(*(p+0)+1), *(p[0]+1));//输出2
printf("%d\n", p[1][0], (*(p+1))[1], *(*(p+1)), *(p[1]));//输出10
printf("%d\n", p[1][3], (*(p+1))[3], *((*(p+1))+3), *(p[1]+3);//输出40
printf("%d\n", p[2][3], (*(p+2))[3], *((*(p+2))+3), *(p[2]+3));//输出44
四、指针数组
概念:指针数组本质上是数组,只不过该数组内存放的是指针。
1.一维数组的指针数组
char *p = "jackken";
//输出第一个字符
printf("%c\n", p[0]);
//输出指针所占的字节数
printf("%d\n", sizeof(p));
2.二维数组的指针数组
char buf[3][4] = {"jack","rose","ken"};
/*指针数组pbuf,相当于一个char 类型的数组数组里面有三个指针,每个指针对应一个字符串的地址。*/
char *pbuf[3] = {"jack","rose","ken"};
//输出元素的内容
printf("%d\n", pbuf[0]);//输出"jack"
printf("%d\n", pbuf[1]);//输出"rose"
printf("%d\n", pbuf[2]);//输出"ken"
//输出地址
printf("%d\n", pbuf);//输出"jack"的地址
printf("%d\n", pbuf);//输出"rose"的地址
printf("%d\n", pbuf);//输出"ken"的地址
总结
指针在C语言中比较复杂,特别是数组指针与指针数组的概念别搞混了。