[CP1511] 指针/Pointer

一、HEX与BIN的转换

这部分应该不需要怎么解释

二、内存/Memory

内存地址一般被表示为十六进制(Hexademical base-16),0xFFFFFFF一般为High memory而0x0000000为低位,存放顺序也是自下而上向上堆放的。在CSE的机器上char->1 byte; int-> 4bytes; double-> 8 bytes。

Pointer的大小在不同的设备类型中也不同,比如在32位平台中pointer只有4bytes大小,而在64位中pointer大小也翻倍来到了8bytes,但是在电器之类的微电脑中只有2bytes。

三、Pointer

int *ip;          // pointer of an int
char *cp;      // pointer of a char
double *fp;  // pointer of a double 

//pointers store the memory address of the variable they refer to
(疑问:在什么情况下pointer不会存储变量所在的地址)

Pointer 有两种运算符:&(返回变量的地址) 和 *(访问pointer提供地址所存储的数据权限)

int i = 7;
int *ip = &i;             //将i的地址传递给ip;
printf("%d\n", *ip);  //输出值为7
*ip = *ip * 6;
printf("%d\n", i);      //输出值为42(改变*ip的值等同于修改i的值,反之亦然) 

Pointer与其他变量一样需要初始化,不需要的话指针可以用NULL来赋值,NULL是由stdio.h库文件定义(#define)的值(等效于“0”),使用NULL本质上也是为了增加可读性。

四、Pointer的使用

//sample1 此时我们不需要return来传递数值,只需要单向传递地址就行

#include<stdio.h>
void transfer(int *n);

int main(void){
	int i = 1;
	transfer(&i);
	printf("%d\n", i);
	return 0;
}

void transfer(int *n){
	*n = *n + 1;
}

最后运行程序结果为2。但是并不代表你不能return一个pointer。

五、Pointer与Array的关系

int nums[] = {1, 2, 3, 4, 5};
int *p = nums;                // 与int *p = &nums[0]; 等效
printf("%d %d\n", nums[2], p[2]);

此时输出的两个数值都为3

虽然看起来原理差不多,但是Array在定义之后的运行中所指向的数组开头的地址是雷打不动的,这点与pointer是有差异的。