一、指针到底是什么?

 

把计算机内存想象成一排带门牌号的储物柜:

 口口口口口口口口口口口口口口

- 每个储物柜(内存单元)能存数据(比如数字10、字符'a');

- 门牌号就是内存地址;

- 指针就是一张记着门牌号的小纸条,专门用来存地址,而不是存数据本身。

 

举个例子:

 

c

int a = 10; // 把10放进编号为0x1234的储物柜(a的地址)

int *p = &a; // 把0x1234写在小纸条p上,p就是指针

 

 

-  &a :取a的“门牌号”(地址);

-  *p :根据p上的门牌号,打开柜子拿出里面的10(解引用)。

 

二、指针和数组的关系

 

数组是连续的一排储物柜,比如 int arr[3] = {1,2,3} :

 

- 数组名 arr 就是第一个储物柜的门牌号(首元素地址),是固定的“纸条”,不能改;

-  arr[0]  = 打开第一个柜子, arr[1]  = 打开第二个柜子;

- 用指针表示就是 *(arr+1) ,意思是“从首地址往后数1个柜子,打开它”,和 arr[1] 完全一样。

 

三、二维数组的指针

 

二维数组是储物柜的格子间,比如 int a[2][3] = {{1,2,3},{4,5,6}} :

 

- 整个二维数组分2个“小房间”(行),每个小房间里有3个储物柜(列);

-  a[0] 是第一个小房间的门牌号(指向第一行首元素), a[1] 是第二个小房间的门牌号;

- 想拿第一行第二个数(2):先通过 a[0] 找到第一个小房间,再往后数1个柜子,即 *(a[0]+1) (也就是 a[0][1] )。

 

 

 

#include <stdio.h>

int main() {

    int a = 10; // 定义变量a,存数值10

    int *p = &a; // 定义指针p,存a的地址(把a的“门牌号”写在p上)

 

    printf("a的数值:%d\n", a); // 直接看a的值

    printf("a的地址:%p\n", &a); // 打印a的“门牌号”(%p是地址格式)

    printf("指针p存的地址:%p\n", p); // 看p上记的门牌号(和a的地址一样)

    printf("通过p取a的值:%d\n", *p); // 按p的门牌号找过去,取出值

    *p = 20; // 按p的门牌号,把柜子里的数改成20

    printf("修改后a的数值:%d\n", a); // 验证a的值变了

    return 0;

}

a的数值:10

a的地址:0x7ffee3b5c8ac // 你的电脑显示的地址会不一样,正常

指针p存的地址:0x7ffee3b5c8ac // 和a的地址完全相同

通过p取a的值:10

修改后a的数值:20

 

 

 

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐