指针深入介绍
众所周知,亚里士多德1撑起了古希腊科学、哲学的半壁江山。
而指针就像是C语言中的亚里士多德一样,撑起了C语言的半壁江山。
不,与其说,指针撑起了C语言的半壁江山,不如说是指针创造了C语言的一片天地。
小明:指针不就是存放了一个地址的变量而已嘛?就这?
小明,数学题你都会做了?还是你终于考上大学了?来这凑啥热闹?
指针类型
首先,要登场的是我们的二级指针
二级指针
小明同学在不经意间,已经说出了一个惊天大秘密!!!
指针就是一个变量
只不过是说 指针 这个变量和其他的变量不同,它存放的是某个数据的位置
变量,就意味着指针也是存放在内存中的某个位置,它也有自己的“门牌号”
也就是只要我有钥匙,我就可以光明正大进入指针的小家
em…当然最关键的还是需要 “&” 老大哥来帮忙配个钥匙
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
//此时ppa变量中存放的内容就是pa指针的地址
return 0;
}
此时,我们就通过ppa可以进入pa的小家,“光明正大”地实施改造计划。
首先,趁着 pa 出门打酱油,将 a 进行改变
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
**ppa = 100;
return 0;
}
小明:就这???
那来个狠的
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
**ppa = 100;
int b = 20;
*ppa = &b;
return 0;
}
新创建一个 b 变量,进行操作 **ppa = &b;
此时再使用 pa 得到的就不是 a 变量,而是 b 变量
指针pa:我媳妇呢???
通过观察,可以知道 二级指针的结构是 int* *p;
其中 int* 表示 p 的数据类型是 int* 类型的
剩下的 **“ * ”**则表示 p 是一个指针
合起来就是一个 指向一个int*类型的变量的指针
可以通过观察二级指针的结构,推导出三级指针,四级指针…
总结:
- 二级指针存放的是一级指针的地址,而一级指针存放的是数据的地址
- 二级指针可以通过两次解引用操作来访问数据
- 二级指针进行一次解引用操作就可以改变一级指针存放的内容
小明:感觉也就一般般吧
字符指针
小明(不屑):字符指针?
eg:
char ch = 'w';
char* pc = &ch;
printf("%c\n", ch);
printf("%c\n", *pc);
小明(不屑地准备滑走)
eg:
char* str1 = "Hello World";
char* str2 = "Hello World";
char strArr1[] = "Hello World";
char strArr2[] = "Hello World";
问:
1、此时 str1 和 str2 相等吗?
答:相等
2、此时 strArr1 和 strArr2 相等吗?
答:不相等
小明:为什么 str1和 str2 相等,而 strArr1 和 strArr2 不相等呢?
"Hello World"是一个字符串常量2,将字符串常量赋值给字符指针的时候是将字符串常量的首元素的地址传给了字符指针,因此 str1 和 str2 指向的都是 字符串常量的首元素的地址
而 strArr1 和 strArr2 是数组,将字符串赋值给字符数组,相当于将字符一个一个复制到了数组中。
小明:那为啥他俩不还是一模一样?为啥电脑告诉我他们不相等?电脑骗人?
注意,计算机是不会骗人的,他们只是严格的执行一条接一条的指令而已。
之所以 strArr1 和 strArr2 不相等是因为他们确实不相等。