一直以来,指针都是我在C语言部分的一大硬伤,因为当初基础概念弄不清楚,导致后来的听课如同听天书。今天,老师帮我们重新梳理了指针的相关知识,虽然只是一些概念性的,由于时间关系没有深入讲解,但这次我好像对指针了解一些了,以下是我的收获。
理解指针:
对于int * p来说:
指针的内容—— 别人的地址
指针的地址—— &p
指针指向的内容—— *p
理解指针类型:
为了方便理解指针类型,我们要明白C语言中各变量类型在内存中占的字节数?
Char——1KB Short——2KB int——4KB long——4KB
float——4KB double——8KB
那么加了指针以后,不同指针类型的输出结果又是什么呢?
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
根据结果,我们可以知道,不论是什么指针类型,在32位平台下永远只占4个字节,在64位平台下占8个字节。
那么有一个问题,既然指针类型占的字节数相同,为什么还要这么多种指针类型呢?不能用一种指针类型表示所有吗?
其实这些指针类型并非无用,它们不仅在解引用操作时能够决定访问字节大小的权限,而且还在指针运算(加/减)的过程中起到了作用
具体有以下示例:
int num = 0x11223344; //在内存中储存为 44 33 22 11
char *p = #
p = p1+1; //因为char型一次访问1个字节,现在我们想访问第二个字节
*p = 0x55; //解引用,修改此字节值为55,num = 0x11 22 55 44
p = p1-1; //同样,访问第一个字节
*p = 0x66; //修改此字节为66,num = 0x11 22 55 66
int *p1 = # //int型一次访问4个字节
int *p2 = #
*p1 = 55; //解引用,则此时num = 0x00 00 00 37
*p2 = 0x55; //num = 0x00 00 00 55