- CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
- 变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
- 指针变量:如果一个变量存储了一份数据的指针(地址)
- int a = 100;
- int *p_a = &a;
- 在定义指针变量 p_a 的同时对它进行初始化,并将变量 a 的地址赋予它,此时 p_a 就指向了 a。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符
&
,否则是不对的。 - 定义指针变量时必须带
*
,给指针变量赋值时不能带*
。 - 指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为:*pointer (解引用)
- 指针变量的加减法:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;
- a 的类型为 int,占用 4 个字节,pa 是指向 a 的指针,如图所示:
-
如果
pa++,则:
-
-
// 数组名可以认为是一个指针,它指向数组的第 0 个元素
int arr[] = { 99, 15, 100, 888, 252 }; int len = sizeof(arr) / sizeof(int); //求数组长度 int i; for(i=0; i<len; i++){ printf("%d ", *(arr+i) ); //*(arr+i)等价于arr[i] }
// 我们使用了*(arr+i)
这个表达式,arr 是数组名,指向数组的第 0 个元素,表示数组首地址, arr+i 指向数组的第 i 个元素,*(arr+i) 表示取第 i 个元素的数据,它等价于 arr[i]。 -