您的位置:首页 > 理论基础

C语言:指针数组、const指针+计算机系统:字节顺序

2017-01-13 17:20 260 查看

知识点(结论)

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(高字节在前,和平时我们使用数字的习惯相同)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: