大白话讲C语言指针
一、指针到底是什么?
把计算机内存想象成一排带门牌号的储物柜:
口口口口口口口口口口口口口口
- 每个储物柜(内存单元)能存数据(比如数字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
更多推荐
所有评论(0)