一、指针的重要性: 指针是 C 语言的灵魂
二、定义
1、地址:内存单元的编号,从0开始的非负整数
CPU 可以直接访问内存,不能访问硬盘!
CPU 和内存之间三根线: 地址线,控制线,数据线
(1)通过地址线确定CPU对哪个内存(内存的哪个编号区域)进行处理
(2)控制线确定是对其进行 读 or 写 or 只读 or 只写
(3)数据线来确定数据传输问题
注意: 内存的范围编号是 0~4G—1, 内存编号不可重复,但不同编号的内容可重复(内存范围:0~FFFFFFFF)
2、指针:指针就是地址!
指针变量是存放内存单元地址(内存单元编号)的变量
指针本质是一个操作受限的非负整数(不能进行加减乘除,只能在某些情况下进行相减)
三、分类
1、基本类型的指针
int * p;
// P 是个变量名字, int * 表示该 p 变量只能存储 int 类型变量的地址
int * p;
int i = 10;
int j;
p =& i; (对)
// 在这 表示 p 保存了 int 类型变量 i 的地址
// 如果没有这句, p会自然存在一个复杂数字(不确定变量)
p =10;(错)
// p只能存放地址,不能直接存放数据
j = * p ; // 等价于 j = i
1/ 把 i 的地址发送给 p, 意味着 p 指向 i
2/ *p 就是 i 变量, 不是 i 的地址,不是 i 的值,就代表 i 本身
3/ 修改 i 或 p 的值,不会影响另一个的值
注意: 1. 常量和表达式前不能加&
四、 如何通过被调函数修改主调函数中普通变量的值
1、 实参为相关变量的地址
2、 形参为以该变量的类型为类型的指针变量
3、在被调参数中通过 *形参变量名的方式修改主函数
# include <stdio.h>
void f(int * p) //不是定义了一个形参,而是定义了一个形参,名字叫做p,它的类型 是int *
{
*p=100;
}
int main(void)
{
int i=4; //用栈的方式存储,是“压”到堆栈里面的
f(&i); //(实参为i的地址) p=&i; p指向i
printf("%d\n", i); //i=100
}
void f(int i)
{
i=100;
}
int main(void)
{
int i=4; //这个i是用栈的形式存储的
f(i);
printf("%d\n", i); // i=4
}