gpt4 book ai didi

c - C 中的数组声明和指针赋值

转载 作者:行者123 更新时间:2023-12-02 05:24:09 24 4
gpt4 key购买 nike

我对 C 中指针和数组声明的基础知识感到困惑。我想知道以下两个语句之间的区别,除了在 seconed 语句中将数组的基地址分配给 ptr。

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

请引用示例进行说明。2号线R侧的[3]有什么影响?

最佳答案

<强>1。二维数组:

int a[2][3]= { {1,2,3},{4,5,6}};

在内存中有了这个语句,你就有了 2x3 整数,它们在内存中都是相邻的。我想你知道如何访问它们,但如果你不知道,我会澄清一下:

a[0][0] : 1
a[0][1] : 2
a[0][2] : 3
a[1][0] : 4
a[1][1] : 5
a[1][2] : 6

<强>2。指向数组的指针:

int (*ptr)[3] = &a[0];

ptr 指向一个 int[3] 内存块。所以你只能将它分配给一个 int[3] 类型:

ptr= &a[0];
ptr= &a[1];

不同的是这个指针没有自己的内存,你必须把它赋值给一个int[3]变量或者分配它:

ptr= malloc (2*sizeof(int[3]);

这样你就可以使用ptr指向的内存,如果你这样初始化ptr:

for(int j=0; j<2; j++)
for(int i=0; i<3;i++)
ptr[j][i]=i+j*3+1;

在这种情况下,您将拥有与 int a[2][3] 相同的内存表示,只是此内存在堆中而不是在堆栈中。您始终可以选择重新分配/释放内存和此内存函数终止后不会被删除。

关于c - C 中的数组声明和指针赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383551/

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