Head First C - 存储器和指针
文章目录
指针
指针就是存储器中某条数据的地址。指针的两件事:避免副本和共享数据。在C语言中使用指针有以下几个原因:
- 函数调用时,可以只传递一个指针,而不用传递整份数据
- 让代码直接对数据进行操作,而不是处理副本
存储器
每当声明一个变量,计算机都会在存储器中某个地方为它创建空间。
int y = 1;
int main(){
int x = 4;
return 0;
}
以上,y是全局变量,计算机把y保存在存储器的全局量段内(Globals)。x是在main()函数内部声明的,计算机会把x保存在存储器区段中的栈中。
-
栈
保存局部变量的部分。 -
堆
用于动态存储:程序运行时创建一些数据,然后使用很长一段时间。 -
全局量
位于所有函数之外,并对所有函数可见。 -
常量段
保存在只读存储器中,保存不变量。 -
代码段
放在存储器地址的低位,代码段是只读的,它是存储器中用来加载机器代码的部分。
计算机可能将栈中4100 000号存储单元分配给x,把‘4’这个值保存在 4100 000号单元里。
想要找到变量的存储器地址,通过 & 运算符(取址):
printf("x保存在 %p\n", &x);
变量地址告诉去哪里照存储器中的变量,因为地址指向了存储器中的变量,地址也有时候叫指针。
C语言的值传递
- main()有一个longitude的局部变量,值为32
- 调用go_south_east()函数时,将变量longitude值复制给了lon,其中进行的是值的传递。
- go_south_east()函数修改了lon,这个值是longitude的副本,但是没有修改longitude。
传递指针变量
把变量longitude的地址传递给go_south_east(),不仅能知道longitude的值的地址,也能知道其中的内容。此时修改白能量的值,就是真正修改了。
指针让存储器易于共享,一个函数可以修改另一个函数创建的数据,只要知道地址。
使用存储器指针
- 得到变量的地址
int x = 4;
printf("x lives at %p\n", &x);
int *address_of_x = &x;
- 读取地址中的内容
int value_stored = *address_of_x;
*运算符和&运算符作用相反,&接收一个数据,告诉地址;*接收一个地址,告诉地址中保存的数据。指针有时候被叫引用,*运算符有时也叫对指针进行解引用。
- 改变地址中的内容
*address_of_x = 99;
把字符串传给函数
字符串实际上就就是字符数组,传参数时,把字符串的地址传送即可。
void fortune_cookie(char msg[]){
printf("Message reads: %s