You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组与指针基础行为的两类技术疑问

嘿,我来帮你把这两个C语言的疑问掰扯清楚,先回顾下你的示例代码和运行结果:

示例代码

int nums[7] = {5,6,7,8,9,10,11};
int *n = &nums[3];
printf("n[0]=%d n[1]=%d n[2]=%d \n", n[0], n[1], n[2]);

运行结果

n[0]=8 n[1]=9 n[2]=10


技术疑问1解答

先给你拍板:C语言的数组完全不属于链表,两者底层结构差得老远了!

  • 数组是一块连续的内存空间,所有元素在内存里是紧紧挨着存放的;而链表是通过指针把分散的内存块串起来的,每个节点都存着下一个节点的地址,完全不要求内存连续。
  • 你能通过指针n访问nums[4]、nums[5]这些后续元素,根本原因是数组的内存连续性。当你把&nums[3](也就是数组第4个元素的内存地址)赋值给指针n后,n就指向了这块连续内存的中间位置。C语言里的n[i]等价于*(n+i),意思是从n指向的地址往后偏移i个int类型的内存空间,然后取这个位置的值——因为数组内存是连续的,所以偏移后正好落在后续数组元素的地址上,自然能访问到。

技术疑问2解答

我把这个疑问拆成两部分给你讲:

  1. 为什么要用&符号?
    指针变量n的类型是int*,它的本职工作是存储内存地址,不是普通的整数值。nums[3]是数组里的一个int类型元素(值为8),而&nums[3]才是这个元素在内存中的实际地址。只有把地址赋值给n,才能让n指向这个元素的位置,后续通过n操作的才是这块内存里的数据。

  2. 为什么直接赋值int *n = nums[3]会崩溃,而int *x = 50却好像没出问题?

  • 先说int *n = nums[3]:你把nums[3]的数值8直接赋值给指针n,相当于让n指向内存地址为8的位置。这个地址通常是操作系统保护的内存区域(比如内核空间或者没分配给你程序的内存),当你后续用n[0]去访问这个地址时,程序就会触发内存访问错误,直接崩溃。
  • 再看int *x = 50:这其实不是“没问题”,只是你没去解引用这个指针而已!如果你尝试写printf("%d", *x),同样会立刻崩溃。这个操作本质是让x指向地址50的位置,这个地址同样是非法的,只是你没去访问它的内容,所以暂时没触发错误——但这绝对是错误的写法,属于C语言里的未定义行为,正经编译器都会给你弹出警告的。

内容的提问来源于stack exchange,提问作者JimmyProton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:12:00