1 指针的本质
1.1-指针的定义
- 如果在程序中定义了一个变量,那么在对程序进行编译时,系统就会给这个变量分配内存单元。在C语言中,指针变量是一种特殊的变量,它用来存放变量地址。指针变量的定义格式如下:
基类型 *指针变量名
。
另外注意:指针变量加1后,偏移的长度是其基类型的长度,例如int *p;
,整形指针变量p,p+1
是偏移sizeof(int)
。 - 按变量地址存取变量值的方式称为直接访问,如
printf("%d\n", i); scanf("%d", &i);
等。 - 将变量i的地址存放到另一个变量中,这一种存取变量值的方式称为间接访问。
- 指针与指针变量是两个概念,一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一个变量的地址(即指针),那么称它为“指针变量”。
1.2-取地址操作符与取值操作符
- 取地址操作符为&,也称引用,通过该操作符我们可以获取一个变量的地址值。
- 取值操作符为*,也称解引用,通过该操作符我们可以得到一个地址对应的数据。
int i = 10;
int j = 5;
int *p; //p就是一个指针变量,p可以用来存储地址,类型是整型指针
p = &i; //初始化赋值
printf("i=%d\n",i); //直接访问
printf("*p=%d\n",*p);//间接访问
2 指针的使用场景
指针的使用场景只有两个,即传递和偏移,记住只有在这两种场景下使用指针。
2.1-指针的传递
- C语言的函数调用均为值传递,所以为了能够在子函数中修改main函数内某个变量的值,可以传递该变量的地址。
2.2-指针的偏移
#include <stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
int* p;//对一个指针变量进行取值,得到的类型是其基类型
p = a;
printf("*p=%d\n", *p);
for (int i = 0; i < 5; i++)
{
printf("%d\n", *(p + i));
}
return 0;
}
指针变量加1后,偏移的长度是其基类型的长度,如上述例子中,(p+0)即a[0],(p+1)即a[1],加括号是为了运算符的优先级原因。