易出错的C语言题目之二:指针

本文深入剖析了C语言中数组与指针操作的底层原理,通过具体实例展示了如何利用指针进行数组的读写操作,并详细解释了相关操作的实现机制与潜在陷阱。主要内容包括数组元素的存储方式、指针与数组的关系、指针运算、数组作为参数传递等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、写出输出结果

#include<stdio.h>

int main(){
    int a[3];
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;

    int *p,*q;
    p = a;
    q = &a[2];

    int c = a[q-p];

    printf("value c = %d/n",c++);
    printf("value c = %d/n",c);

    return 0;
}

答案:

value c = 2/nvalue c = 3/n

解析:

此处q-p=2,容易错,地址相减得除以类型,表面上差了8,实际上差了2。不同类型的地址,比如char *p,额int *p,p-q不能操作,报错。

二、写出下列函数运行结果

#include<stdio.h>

int main(){
    int a[5] = {1,2,3,4,5};
    int *ptr = (int*)(&a+1);

    printf("%d,%d",*(a+1),*(ptr-1));
    return 0;
}

答案:

2,5

解析:

a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5]

三、假如我们的a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?

#include<stdio.h>
int main(){
    int a[5];
    printf("%x\n",a);
    printf("%x\n",a+1);
    printf("%x\n",&a);
    printf("%x\n",&a+1);
    return 0;
}

答案:

0Xbfe2e100

0Xbfe2e104

0Xbfe2e100

0Xbfe2e114

解析:

a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),因此a+1地址为0Xbfe2e100+sizeof(int) = 0Xbfe2e104;

而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5],因此&a+1地址为0Xbfe2e100 + 5*sizeof(int) = 0Xbfe2e114(十六进制)

转载于:https://www.cnblogs.com/AndyJee/p/5229945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值