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

知识点(结论)

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(高字节在前,和平时我们使用数字的习惯相同)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值