参考c语言中文网:http://c.biancheng.net/view/1990.html
计算机中所有的数据都必须放在内存中,不同类型的数据占用字节数不同,为了正确地访问或找到这些数据,必须为每个字节都编上号码(采用16进制),每个字节的编号都是唯一的,像身份证一样
我们将内存中字节的编号称为地址或指针
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
以%#X或%p形式来输出&变量的地址。
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。
变量->数据
函数->代码
指针 == 16进制编号
数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。
CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
*称为指针运算符,既用来定义一个指针变量(用来区分普通变量)也用来取得某个地址上的数据(取值)。
int a=100; // a的地址为0x1000
int *p=&a; // p的值为0x1000,此时为定义
printf("%d\n",*p);
//表示对该地址取值 即 *p == a 为true
关于指针(编号)的加减
对地址的加减涉及到定义指针变量时的变量类型
int a=100 ,*p = &a;
printf("%p\n",p); //地址为0x1000
p++; // p++ != *p++
printf("%p\n",p); //地址为0x1004
因为int占4个字节,对整型变量指针+1就为跳过4个字节
数组的特殊性
数组在内存中一块连续的内存,数组名就是指针?
(数组等价于指针,这是不完全正确的,但大多数情况下可以这样认为)
它指向数组的第0个元素
int a[] = {1,2,3}
printf("%p %p\n",a,&a[0])
注: int *p = a ;等价于 int *p = &a[0]
借由这个特性我们可以推导出对数组名+1就是让指针向后移动一位
printf("%d\n",*(a+1)); // *表示对地址取值,此时为a[1]
网友评论