生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起
了新的名字叫:指针。
所以我们可以理解为:内存单元的编号==地址==指针
1、指针变量
我们知道的是:数组名是数组首元素的地址。也就是说,如果有一个arr数组,那么
arr == &arr[0];
两者都是常量,在程序的运行过程中,不会改变。但是,可以把它们赋值给指针变量,然后可以修改指针变量的值。
那如何创建指针变量呢?
int* p;
像这种就创建了一个指针变量p ,它的类型是int。指针变量也是一种变量,这种变量就是用来存放地址的,存放在指针变量的值都会被理解为地址。
#include <stdio.h>
int main()
{int a = 10;int* p = &a;return 0;
}
注意:存放什么类型的数据在指针变量的中,那么指针变量就是该类型。
int a = 10;
char* p = &a;
像这种,编译器就会产生从 int*到char*的类型不兼容的错误,我们应该避免掉。
指针变量的大小
32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。
如果指针变量是用来存放地址的,那么指针变的大小就得是4个字节的空间才可以。
同理64位机器,假设有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要
8个字节的空间,指针变的大小就是8个字节。(x64环境下)
结论:
- 32位平台下地址是32个bit位,指针变量大小是4个字节
- 64位平台下地址是64个bit位,指针变量大小是8个字节
- 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
指针的解引用
用 * 符对指针进行解引用
指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。
比如:char*类型的指针解引用就只能访问一个字节,而int*类型的指针解引用就能访问4个字节。
2、指针运算
指针+-整数
先来看一段代码,观察地址的变化
#include <stdio.h>
int main()
{int n = 10;char *pc = (char*)&n;int *pi = &n;printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc+1);printf("%p\n", pi);printf("%p\n", pi+1);return 0;
}
代码的运行结果如下:
我们可以看出,char*类型的指针变量+1跳过1个字节, int*类型的指针变量+1跳过了4个字节。 指针的类型决定了指针向前或向后走一步有多大(距离)。
指针的值是它所指向对象的地址。地址的表示方式依赖与计算机