gpt4 book ai didi

c - C 中数组和指针的基本行为

转载 作者:行者123 更新时间:2023-11-30 20:48:00 25 4
gpt4 key购买 nike

#line 1----int nums[7] = {5,6,7,8,9,10,11};
#line 2----int *n = &nums[3];
#line 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

第一个问题:

数组是 C 语言中的 LinkedList,这就是为什么第 2 行中的值(在第 3 行中打印)还包括 nums[4]、nums[5]...等等的值(它们是8、9、10...等)?

第二个问题:

为什么第 2 行有一个“&”符号?如果我创建一个变量并将其打印出来,而不使用 & 符号,它会正常打印出来,例如:

int *x = 50;
printf("X: %d",x) // prints out 50

但如果我这样做:

int *x = 50;
printf("X: %d", &x) // prints out 684958....some long number

但是当它是一个数组时,在上面的示例中:

#line 2----int *n = nums[3]; // I removed the & from &nums[3]

#line 3----printf("n[0]=%d n[1]=%d n[2]=%d \n", n[0], n[1], n[2]);

程序崩溃了。

为什么这里有差异?

最佳答案

第一个问题: 数组是 C 语言中的 LinkedList 吗? 不,数组和 linkedList 都是不同的。 LinkedList(相似/不同数据类型的集合)可以将数组(相似数据类型的集合)作为其一部分,但两者并不相同。

int nums[7] = {5,6,7,8,9,10,11};

这里nums是一个由7个整数组成的数组,所有元素都存储在连续内存位置中,数组名称代表其基地址。假设 nums 起始地址是 0x100 那么它看起来像

  nums[0]   nums[1]    nums[2]     nums[3]   nums[4]   nums[5]   nums[6]
-------------------------------------------------------------------------
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
-------------------------------------------------------------------------
0x100 0x104 0x108 0x112 0x116 0x120 0x124
nums
LSB

接下来执行语句int *n = &nums[3];,其中n是整数指针,它指向&nums[3]0x112 如上所示。因此,对于 n n[0]0x112 而不是 0x100 并且如果您递增 n > 它增加 4 个字节等等。

    -----------
| 0x112 | <--- int *n = &nums[3]; /* n is pointer and it needs address and here & is unary operator and &num[3] is assigned to n */
----------
n

---------------------------------------------------------------------
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---------------------------------------------------------------------
0x100 0x104 0x108 0x112 0x116 0x120 0x124
| | | |
n[0] n[1] n[2] n[3]

根据你的问题,代码块

int *n = nums[3]; // I removed the & from &nums[3]
printf("n[0]=%d n[1]=%d n[2]=%d \n", n[0], n[1], n[2]);

这里n指向8并且它不是一个有效的地址,看起来像

   ---------
| 8 | <-- not that n is int pointer
---------
n

当您尝试打印 n[0] 时,它会崩溃,因为您尝试打印地址 8 处的值,该地址是无效地址,地址 8 可能会保留用于其他目的,而不是用于可执行文件 a.out

n[0] = *(n + 0)
= *(8) = you are dereferencing invalid address which causes crash

还有

    int *x = 50;
printf("X: %d",x) // it prints what X holds and that is 50
printf("X: %d", &x); /* &X means address of X, its an address not some long number , also use %p format specifier to print address. */
printf("X: %d", *x); /* this will cause crashes, as X points to invalid address

这里x是一个整数指针,它应该使用有效地址进行初始化,例如

int var = 50;
int *x = &var; /* now x points to valid address */
printf(" value at the address : %d\n",*x);/* prints 50 */

最后,我的建议是阅读一本好的 C 书籍并很好地理解数组和指针章节。

关于c - C 中数组和指针的基本行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50435114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com