前言
提示:C语言指针部分的学习,关键是理解,可我就是不理解那又能怎样,所以自己主动梳理一遍,你如果单纯看了我的梳理,那么恭喜你,你会日常拉闸走起;如果看着思路自己梳理了一遍,告别拉闸,溜的飞起。
一、指针是什么?
pointer:指针;存内存地址的变量。
二、指针变量
1.地址与取地址符
在C语言中*的意思有:
1.声明指针
int *p;
2.取指针的值
char str[10] = "asdf";
printf("%p", *str); //这里取地址
3.乘法运算符
&在C语言中是取地址的意思
int year = 666;
int *p;
p = &year; //这里p得到的是year的地址
2.指针与数组的那些事
对于数组,首先查老底:
1、在内存中的,占着一个连续的存储空间
2、数组名是数组的首地址(头地址),就是数组中第一个元素的地址,是常量
首先,来探讨一个问题:
对于一个数组num[3],num与&num的含义是否相同?
int num[3] = {22, 33, 66};
printf("%p\n", num); //输出0x7fff1ca16064
printf("%p\n", &num); //输出0x7fff1ca16064
printf("%p\n", num+1); //输出0x7fff1ca16068
printf("%p\n", &num+1); //输出0x7fff1ca16070
根据结果发现num与&num的地址是一样的,但是num+1跳过4个字节(一个数组元素长度),&num+1跳过了12个字节(一个数组长度);有此可见,虽然二者的都代表数组的地址,但是所占的内存不一样,num默认申请的是一个数组元素长度大小的空间,&num申请的空间是一个数组长度所占的空间。
那么取一个数组的首地址可以写成:
int num[3] = {22, 33, 66};
int *p;
p = &num[0];
printf("%p\n", &num[0]); //输出0x7fff4ece27bc
printf("%p\n", num); //输出0x7fff4ece27bc
printf("%p\n", p); //输出0x7fff4ece27bc
写成上面的样子,输出某个元素怎么搞呢:
printf("%d\n", *p); //输出第一个(num[0])
printf("%d\n", *(p+1)); //输出第二个(num[1])
不建议写成下面这样子,因为想要逐个输出数组元素(或者输出某个)的时候,怎么搞,脑壳疼。
int num[3] = {0};
int (*p)[3];
p = #
printf("%p\n", &num[0]); //输出0x7fff4dc20a7c
printf("%p\n", num); //输出0x7fff4dc20a7c
printf("%p\n", p); //输出0x7fff4dc20a7c
对于字符串数组,直接上例子:
char string[] = "Hello";
printf("%s\n", string); //输出Hello
char *string2 = "Hello";
printf("%s\n", string2); //输出Hello
printf("%p\n", &string); //输出string的地址 0x7ffe9e459b60
printf("%p\n", &string2); //输出string2的地址 0x7ffe9e459b58
printf("%p\n", string2); //输出string2保存的的的地址 0x4a11c4
printf("%p\n", &"Hello"); //输出Hello保存位置的地址 0x4a11c4
printf("%p\n", *string2); //输出0x48
printf("%c\n", *string2); //输出H