这里写目录标题
一、定义和区别
1.指针的定义
指针是C语言中一种特殊的变量,它存储的是另一个变量的内存地址(可用'&'取地址符来获取,详见下)
。指针变量的主要用途是提供一种间接访问内存的方式。通过指针,程序可以动态地访问和修改存储在内存中的值。
2.指针变量的定义
指针变量是用于存储地址的变量。它定义了一种数据类型,该数据类型可以指向另一种数据类型的内存地址。例如,int *p;
定义了一个指向整型数据的指针变量p
。
3. 区别
指针:是C语言中的一种数据类型,它本身不存储数据,而是存储数据的内存地址。
指针变量:是指针的具体实例,它是一个变量,可以存储一个地址,并且可以通过这个地址来访问或修改内存中的数据。
举一个例子:
int *p; // 声明了一个指向整型数据的指针,即整型指针
那么 p 就是指针变量,其值(存储的地址值可变)
二、声明和初始化
1.指针的声明
声明指针时,需要指定它所指向的数据类型。这告诉编译器指针应该访问哪种类型的数据。例如:
int *p; // 声明一个指向整型数据的指针
char *c; // 声明一个指向字符数据的指针
float *f; // 声明一个指向浮点型数据的指针
2.指针的初始化
指针变量需要被初始化,即赋予一个内存地址,才能使用。通常,这是通过将变量的地址赋给指针来完成的:
int var = 10;
int *p = &var; // p现在指向var的内存地址
三、'*'
操作符的两种名称(使用方法)
1.指针声明操作符:
当*
用于变量声明时,它表示该变量是一个指针类型。这个操作符放在变量名之前,用来指定变量可以存储其他变量的内存地址。例如,在 int *p;
中,*
表示 p
是一个指针变量,它可以存储整型数据的地址
2.解引用操作符:
当 *
操作符用于指针变量前面时,它表示对指针指向的内存地址上的数据进行访问或读取。这种操作称为解引用。例如,如果p
是一个指针,*p
就是获取p
所指向地址上存储的数据。
四、指针的类型
指针的类型非常重要,因为它决定了指针可以访问的内存大小和对齐要求。例如,int *
只能用于访问整型数据,char *
用于访问字符型数据。
int *p; // 声明一个指向整型数据的指针
五、空指针
空指针是一个不指向任何地址的指针。在C语言中,NULL
宏定义用来表示空指针:
int *p = NULL; // p是一个空指针
☆避免访问未初始化的指针!!!
什么是未初始化的指针呢?指针是用来存储另一变量的内存地址信息的。如果在指针定义之后为令其指向另一变量的内存。 那他就被称为未初始化的指针。
因此建议每次在定义完指针之后,就将其初始化为空指针。
int *p = NULL; // p是一个空指针
以下代码是访问未初始化指针的错误示范:
#include <stdio.h>
int main()
{
int *a;
*a = 123;
return 0;
}
六、指针变量的大小
根据所使用编译器的不同,指针变量所占内存的大小也不同, 32位编译器。指针变量大小为四个字节。 64位编译器指针变量大小为八个字节。
以下以我所使用的32位编译器为例:
1 #include <stdio.h>
2
3 int main() {
4 char a = 'F';
5 int f = 123;
6
7 char *pa = &a;
8 int *pb = &f;
9
10 printf("a = %c\n", *pa);
11 printf("f = %d\n", *pb);
12
13 *pa = 'C';
14 *pb += 1;
15
16 printf("now,a = %c\n",*pa);
17 printf("now,f = %d\n",*pb);
18
19 //地址都是四个字节,与其指向的类型无关
20 printf("sizeof pa = %d\n",sizeof(pa));
21 printf("sizeof pb = %d\n",sizeof(pb));
22
23 //输出变量地址,使用%p正确输出
24 printf("the addr of a is: %p\n",&a);
25 printf("the addr of a is: %p\n",pa);
26 printf("the addr of f is: %p\n",&f);
27 printf("the addr of f is: %p\n",pb);
28
29 return 0;
30 }
运行结果:
可视化执行(代码可视化网站):