首先明确一个概念:指针就是地址!
然后了解一下指针要用到的符号
1.& :取地址符。&a ,得到a的地址
(在c语言中还有一种用法就是按位与,是一个双目运算符)
2. * 在指针中有两种用法
(1)定义指针变量 int *p; int *p=&a; int**pp=&p;
(2)间接访问符,又称“解引用” *p=20; **pp=100;
可以区分这两种情况,定义时,类型后面加 *,说明是指针变量,使用时,不加类型,做左值,说明是要进行解引用
(在c语言中还有一种用法就是乘法符号 3*4=12)
int a : 定义一个整型变量,存放的是整型数据
int *p : 定义的是一个整型的指针变量,存放的是整型地址
char *p :定义的是一个字符型的指针变量,存放的是字符型的地址
可以看出,指针变量只比一般变量多一个解引用。
变量 类型 取地址 类型
a -> int &a——> int *
e -> short &e——>short *
p -> int * &p——> int * *
上面就是说,如果一个变量是整型变量,对它取地址就是整型指针
如果是短整形变量,对它取地址就是短整形指针
如果是指针变量,对它取地址就是指针的指针,即二级指针(也可以说指针的地址,地址的地址)
int main()
{
int a = 10;
int b = 20;
int *p = &a; //定义一个指针变量保存a的地址
*p = 100; //a = 100;
//p指向a,通过对p解引用,修改a的值
p = &b;
*p = 200; //b = 200;
//p又指向b,通过对p解引用,修改b的值
int **pp = &p;//定义一个指针的指针变量pp,保存的是指针变量p的地址
//p是指针变量,也是一个变量,所以它也有地址,它的地址用也是用一个指针保存的,只不过这个指针 有点特殊,是一个二级指针
*pp = &a; //p = &a;
//对pp解引用,就是p,p保存a的地址
**pp = 1000; //a = 1000;
//对pp解引用一次是变量p的值,再解一次引用就相当于对指针变量p解引用,就是变量a的值。
*pp = &b; //p = &b;
//对pp解引用就是变量p的值,p保存了b的地址
**pp = 2000; //b = 2000;
//对pp解引用一次是变量p的值,再解一次引用就相当于对指针变量p解引用,就是变量a的值。
return 0;
}
指针占用的字节数:
sizeof(int *) //4
sizeof(char *) //4
sizeof(short *) //4
sizeof(int **) //4
sizeof(int ******) //4
可以看出不管是什么类型的几级指针,都占四个字节,我们一般也默认指针占四个字节。
但并不是一定占四个字节,占多少个字节与平台有关,在32位的平台上,最多用4个字节就够了,因为32位最多能表示的数据范围就是2的32次方,即4个G。分配4个字节,一个字节8位,足够表示4个G。但是在64位的平台就不行了,必须要分配8个字节才能表示2的64次方个数。
所以在X86或者是32位的平台上,指针占4个字节
在X64或者64位的平台上,指针占8个字节
如果有的题说到了在一个64位的平台上,一定要留意指针占8个字节。
如果定义了整型两个变量,对他们取地址,会发现它们的地址总是相差12个字节,因为编译器的地址都是按顺序分配的,应该是相差4个字节,但是微软的编译器防止越界,会在两个变量的地址中间加两个相同类型的变量,所以整型变量之间的地址一般相差12个字节。