1 基本概念
- 在C语言中地址就是指针,两者是等价的;
- 存放指针的变量就是指针变量;
- 指针就是用来存放地址的,存放谁的地址,就说指针指向谁(这里的“谁”范围就很宽,比如基本类型变量、数组、结构体等等);
- 指针存在的意义就是通过指针找到其指向的对象;
2 指针定义
指针变量的定义如下:
写法1 :int* p = &a;
写法2 :int *p = &a;
详细说明如下:
- 变量名是p,不要被写法2迷惑;
- *表示p是一个指针,即p是一个指针变量;
- int表示p所指向的对象是int型;
- p=&a表示取变量a的地址存放于指针变量p中,即p指向a;
- 注意口头语一般说p是个指针,其实是指p是个指针变量;
两种写法的区别:
- 写法1在定义一个指针的时候看着更清晰明确;
- 写法2在定义多个指针的时候更有优势,其明确指明*和哪一个指针相结合,例如:
int *p1, *p2, *p3;//定义三个指针p1,p2,p3
int* p1, p2, p3; //定义1个指针p1和两个int型变量p2,p3
3 指针大小
- 不管指针指向什么类型,都是指针变量,指针变量是用来存放地址的;
- 指针变量的大小取决于一个地址存放的时候需要多大的空间;
- 32位平台上的地址:32bit - 4byte,所以指针变量的大小是4个字节;
- 64位平台上的地址:64bit - 8byte,所以指针变量的大小是8个字节;
4 示例
代码如下图所示:
int main()
{
//
puts("打印a的值和地址");
int a = 10;
printf("a=%d\n", a);
printf("&a=%p\n", &a);
puts("");
//
puts("打印p的值和p解引用后的值");
int* p = &a;
printf("p=%p\n", p);
printf("*p=%d\n", *p);
puts("");
//
puts("通过对p解引用间接修改a的值");
*p = 20;
printf("*p=%d\n", *p);
printf("a=%d\n", a);
puts("");
//
puts("不同类型指针大小");
printf("char* = %zu\n", sizeof(char*));
printf("short* = %zu\n", sizeof(short*));
printf("int* = %zu\n", sizeof(int*));
printf("long* = %zu\n", sizeof(long*));
printf("float* = %zu\n", sizeof(float*));
printf("double* = %zu\n", sizeof(double*));
puts("");
return 0;
}
代码运行结果如下图所示:
运行结果分析:
运行结果显示 不同类型指针大小结果为4字节,而电脑是64位系统,地址应该是8字节才对啊,怎么回事呢?
这个和开发工具的配置有关,在VS2019下默认的解决方案平台是x86,是32位平台,所以指针大小最后显示为4字节,如下图所示,Debug显示为x86:
当把x86改为x64之后,指针大小打印结果如下图所示: