指针,c语言笔记
笔记分为两个部分:
- 指针变量本身的内容是什么?
- 如何“取”指针所指向的东西?
我用最通俗易懂的方式给你解释一下。
1. 指针变量是什么?它的内容是什么?
一句话概括:指针变量是一个特殊的变量,它里面存储的不是普通的数据(比如数字、字符),而是另一个变量的内存地址。
你可以把内存想象成一条长长的街道,每个房子都有一个唯一的门牌号(这就是内存地址)。变量就是住在这个房子里的“人”(数据)。
- 普通变量(如
int a = 10;):相当于叫a的人,他住在“幸福路101号”这个房子里,他本人就是数字10。 - 指针变量(如
int *p = &a;):相当于一个“地址簿”,这个地址簿的名字叫p,它里面只记录了一行信息:“幸福路101号”。这个门牌号就是指针变量p的内容。
2. 如何“取”?—— 两个关键运算符:& 和 *
这是操作指针的核心,你一定要分清。
a) 取地址运算符:&
- 作用:获取一个变量的内存地址。
- 怎么用:放在变量前面。
- 中文理解:“取……的地址”。
int a = 100; // 定义一个普通整数变量a,并赋值为100
int *p; // 定义一个指针变量p,它将来要指向一个整数
p = &a; // 使用 & 运算符,取出变量a的地址,并把这个地址赋值给指针p
// 现在,指针p的内容就是变量a的内存地址
b) 解引用运算符:*
- 作用:根据指针变量里存储的地址,去找到并访问那个地址里存放的数据。
- 怎么用:放在指针变量前面。
- 中文理解:“取……所指向的值”。
int a = 100;
int *p = &a; // p保存了a的地址
printf("a的值是:%d\n", a); // 输出:100 (直接访问a)
printf("a的值是:%d\n", *p); // 输出:100 (通过指针p间接访问a)
// *p 就相当于找到了p记录的那个门牌号(a的地址),然后进去把里面的人(数据100)带出来。
一个完整的例子
#include <stdio.h>
int main() {
int number = 99; // 定义一个整型变量number,值为99
int *pointer; // 定义一个整型指针变量pointer
pointer = &number; // 把number的地址赋值给pointer
printf("1. number变量的值:%d\n", number);
printf("2. number的地址是:%p\n", &number);
printf("3. 指针pointer的内容(它存的是什么):%p\n", pointer); // 这个值应该和上一行一样
printf("4. 通过pointer取出的值(*pointer):%d\n", *pointer);
// 我们还可以通过指针来修改它指向的变量的值
*pointer = 200; // 这行代码的意思是:找到pointer指向的那个地址(也就是number的家),然后把200放进去。
printf("5. 通过*pointer=200修改后,number的值是:%d\n", number); // number变成了200
return 0;
}
输出结果可能类似于:
1. number变量的值:99
2. number的地址是:0x7ffeedd80a5c(一个十六进制地址,每次运行可能不同)
3. 指针pointer的内容(它存的是什么):0x7ffeedd80a5c(和上一行一样)
4. 通过pointer取出的值(*pointer):99
5. 通过*pointer=200修改后,number的值是:200
总结表格
| 表达式 | 中文含义 | 解释 |
|---|---|---|
int *p; |
定义一个指针 | 声明p是一个指向int类型的指针变量。 |
p = &a; |
取a的地址给p | 获取变量a的内存地址,并将其存入指针p。 |
*p |
取p所指向的值 | 根据p中存储的地址,找到并访问那个地址中的数据。 |
*p = 20; |
给p指向的地方赋值 | 根据p中存储的地址,找到那个位置,并把20存入。 |
指针概念简洁版:
基本概念
- 指针:存地址的变量
&a:取a的地址*p:取p指向的值
间接访问
- 通过指针操作数据
- 修改
*p即修改原变量
指针运算
p+1:移动一个类型大小- 指针相减:得到元素个数
数组
- 数组名即首元素地址
arr[i]等价于*(arr+i)
函数
- 指针参数:可修改实参
- 传地址比传值高效
多级指针
int **pp:指向指针的指针**pp:两次解引用- 会用四维指针的程序员很厉害
特殊指针
- NULL:空指针,不指向任何地方
- 野指针:未初始化,危险
- const指针:限制修改权限
注意
- 指针大小固定(4/8字节)
- 使用前必须初始化
- 解引用前检查非空
核心:指针就是地址,*是取内容,&是取地址。
查看25道真题和解析