1.
type p = ?
表示从内存地址p开始,开辟一段内存,内存大小为类型type规定的字节数,然后把等号右边的值写入到这段内存中。
因此,这块内存起点位置是p,结束是p+type字节数-1。
2.
type* p = ?
表示从内存地址p开始,开辟一段内存,用于存放地址,被存放的地址的值类型为type。 64为系统上,开辟的内存大小为固定8字节,与type的具体类型无关。因为指针变量保存的是地址,其大小与寻址空间有关。 换言之,只要是指针变量,其大小就是8字节。因为8字节可以表示64位所有地址。 可想而知,在32位系统上,指针变量大小是4字节。
3.
p = ?
表示向内存地址p上写入等号右边的数。
4.
? = p
表示取出地址p上的值,放入寄存器,给等号左边使用。
5.
? = &p
表示取出地址p,放入寄存器,给等号左边使用。
6.
? = *p
表示取出地址p的值指向的地址的值,放入寄存器,给等号左边使用。
7.
int *p = &q
开辟地址p,在地址p上写入地址q,且地址p的值指向的地址的值类型是int。并且用"*"来声明C是地址,可以做*p运算,使得*p写法能通过编译。
8.
int *p = C
开辟地址p,在地址p上写入常数C。且声明C指向的地址的值是int。
这种写法能通过编译,也能运行。但是地址的分配是在运行时才发生,除非该常数在运行时恰好命中一个已分配的地址,否则在运行时会报错。
9.
10.
11.
12.
char* p = "hello";
这句代码开辟了两块内存空间:
首先,在内存常量区开辟地址q,写入连续的字符“hello”,以及最后的结尾标识符“\0”。共6字节。
然后,开辟地址p,在地址p上写入地址q,且声明地址q的值类型是char。因此p实际上是一个指向字符的指针。*p的运算结果是第一个字节h。