如果
int a[] = {1, 2, 3};
int * pa = a + 15; // 指针偏移 指针变量加上一个偏移 那么它的实际地址为a的地址+sizeof(a)*偏移大小
printf("%d", pa); // 输出a地址的大小+sizeof(int)*15;
又如:
int* pa = NULL; // 这里是声明指针pa并给他的地址赋值为0,也就是pa变量保存的值为0,而0地址中存放的值(也就是我们通常意义上所谓的pa指向变量的内容)是未知的,很有可能是系统非法访问的。
int* pb = pa + 15;
printf(“%d”, pb); // 60 指针变量中的值就是0 + 15*4
printf(“%d”, *pb);// 很有可能报错, 因为有很多地址的是不能够访问,所以它所指向的内存内容是不可打印的。
另外,
(1)
char* str = "123"
cout << str << endl; // 123 它的原理跟printf打印字符串一样 打印的是指针指向的内容
printf("%s", str); // 123
cout << &str <<endl; // 输出的是指针变量str的地址,而不是“123”的首地址
printf(“%x”,&str)// 同上
那怎么获得(打印)“123”的首地址呢?
printf("%p\n", str); // 改一下打印控制符就可以了打印的是字符串 首地址
printf("%p\n", &str[1]); // 打印的是第二个字符的地址
当然
cout <<(void*)str <<endl; // 输出的也是字符串的首地址
(2)
int* p = (int*)malloc(sizeof(int)*10);
p[0] = 1;
p[1] =2;
p[3]=3;
cout << p <<endl; // 打印的是p的内容,即p中存放的地址(也是申请的一块空间首地址)
cout<<&p<<endl; // 打印的是p的地址,存放指针变量p的地址