1 概述-指针的出现解决了什么问题
关于这个问题很多文章感觉也没有说清楚,我更是不知从何说起。
最大的感受就是可以间接寻址,摆脱实参和形参数据拷贝问题。
2 变量地址和地址的存储
2.1 取地址运算符-&
&运算符的作用就是取得变量在计算机内存中的地址,示例代码如下。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
// 获得一个变量的地址
int a = 0;
printf("%p\n", &a); //打印地址使用%p
return 0;
}
2.2 变量地址的存储and解引用
1 变量的地址用对应类型的指针变量存储(类型不对应在解引用时会出错)
2 解引用-得到指针变量存储的地址下存储的值
int main() {
int a = 1010;
int* p = &a;
printf("%d\n", *p); // 输出 1010
}
2.3 指针变量的大小
#include <stdio.h>
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%zd\n", sizeof(char *));
printf("%zd\n", sizeof(short *));
printf("%zd\n", sizeof(int *));
printf("%zd\n", sizeof(double *));
return 0;
}
2.4 指针变量±整数
结论:指针的类型决定指针前进或后退一步的长度
int main()
{
int n = 1010;
char* pc = (char*)&n;
int* pi = &n;
printf("%p\n", &n); // 000000A5BE4FF974
printf("%p\n", pc); // 000000A5BE4FF974
printf("%p\n", pc + 1);// 000000A5BE4FF975
printf("%p\n", pi); // 000000A5BE4FF974
printf("%p\n", pi + 1);// 000000A5BE4FF978
return 0;
}
3 const修饰
1 被const修饰的变量初始化后不能被修改
int main() {
int m = 0;
m = 20;
const int a = 10;
//a = 1; //报错,a的值不能被修改
return 0;
}
可我就是想修改a的值怎么办呢?我们看一下下面的代码
int main() {
int m = 0;
m = 20;
const int a = 10;
int* p = &a;
*p = 20;
printf("a = %d\n", a); // a = 20
return 0;
}
从程序的输出我们可以看到,a的值变成了20,成功地改变了a的值。当然,如果const修饰的变量可以通过这种方式更改的话,程序的安全性就会大打折扣。所以我们需要让a的值无法通过指针的方式更改,也就是说,即使让一个指针拿到了a的地址,也无法改变a的地址。(下次接着写吧,困了)。