知识点(结论)
1. 《深入理解计算机系统》中的解释:
在C语言中,我们能够用数组表示法来引用指针,同时我们也能用指针表示法来引用数组元素。
2. 引申一下const,int const *p与int *const p。
但是这个链接里的例子有点小问题,不太好理解,这里总结一下:
- 直接修改 test1 = 数字; 这样的格式。这三个声明方式都可以被修改的。
- 所以:
- 三的实例应该加上 *p = 4;(可运行)
- 四的实例应该加上test2 = 3;(可运行)
- 结论是:
- const *p表示*p不能被修改;
- *const p 表示p不能被修改;
- const int *const p表示p与*p都不能被修改;
- 但是!!!!!p指向的内容,比如是test1的话,test1的值在三个情况下都是可以修改的!
3. 具体解释:
//普通数组用法:
int i, a[] = {1,2,3,4};
for(i = 0; i < 4; i++){
printf("%d\n", a[i]);
}
//我们还可以这样访问元素
//a就是数组名,其实就是一个常量指针
for(i = 0; i < 4; i++){
printf("%d\n", *(a+i));
}
//因此我们可以用指针表示法来引用数组
int *pa;
pa = a;
for(i = 0; i < 4; i++){
printf("%d\n", pa[i]);
printf("%d\n", *(pa+i));
printf("%d\n", *pa++);
//printf("%d\n", *a++);就会报错,因为a(数组名)是一个常量指针,不能被修改
//同理,int *const pa = a; pa就不能被修改了pa++就会报错
}
代码示例(数组表示法来引用指针)
1. 来源:《深入理解计算机系统》字节顺序 探索 代码
2. 目的:使用强制类型转换(cast)来访问和打印不同程序对象(int、float、pointer)的字节表示:
#include<stdio.h>
//使用typedef命名数据类型,改善代码可读性
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len){
int i;
for(i = 0; i < len; i++)
//C格式化指令"%.2x"表示整数必须用至少两个数字的十六进制格式输出
//引用start[i]表示我们想要读取以start指向的位置为起始的第i个位置处
//的字节,因为是数组表示法来引用指针,所以不用加上*
//相当于start这个数组名(指针)=&x
printf("%.2x", start[i]);
printf("\n");
}
void show_int(int x){
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x){
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x){
show_bytes((byte_pointer) &x, sizeof(void *));
}
void test_show_bytes(int val){
int ival = val;
float fval = (float) ival;
int *pval = &ival;
show_int(ival);
show_float(fval);
show_pointer(pval);
}
3. 结果:
- 12345的十六进制为 0x00003039
- 小端:39 30 00 00(低字节在前)
- 大端: 00 00 30 39(高字节在前,和平时我们使用数字的习惯相同)