c - 数组退化为指针

标签 c

请帮助我理解下面的程序。

#include<stdio.h>
int main()
{
    int a[7];
    a[0] = 1976;
    a[1] = 1984;
    printf("memory location of a: %p", a); 
    printf("value at memory location %p is %d", a, *a); 
    printf("value at memory location %p is %d", &a[1], a[1]);
    return 0;
}

&a[1]&a+1。它们相同还是不同?

#include <stdio.h> 
int main() 
{
    int v[10];
    int **p; 
    int *a[5];
    v[0] = 1234;
    v[1] = 5678;
    a[0] = v; 
    a[1] = v+1;
    printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a);
    printf("%d\n", sizeof(v));
    return 0;
} 

我想知道 *a[5] 在内存中是如何表示的。 *a 是指向 a[0],a[1],a[2],a[3],a[4] 的基指针吗?

#include<stdio.h>

int main()
{
    int v[10];
    int **p;
    int (*a)[10];
    a=&v;
    printf("%d\n",*a);
        return 0;
}

a=v;//给出错误原因? 此处的 v 是否衰减为 *v。那么 &v 是否会退化为 (*)[]v? & 表示常量指针。在这里,如何在不进行类型转换的情况下将 const 指针设置为非常量指针?

数组存储在内存中的什么位置。它是否存储到内存的数据段。

#include<stdio.h>

int main()
{
    int carray[5]={1,2,3,4,5};
    printf("%d\n",carray[0]);
    printf("%d\t%d\t%d\n",sizeof(carray),sizeof(&carray),sizeof(&carray[0]));
    return 0;
}

已编辑:

我看过一些文章,其中指出数组名称不能被解码为指针的唯一两种可能情况是 sizeof&。但在上面的程序中,sizeof(&carray) 给出的大小为 4。&carray 衰减为 (*)[]carray 作为其右值.

那么在 sizeof& 这两个条件下数组名不能衰减为指针的声明在这里变为假。

最佳答案

&a[1] and &a+1. Are they same or different?

不同。 &a[1] 等同于(a+1)。一般来说,x[y] 根据定义等同于 *(x+y)

I wanted to know how *a[5] is represented in memory. Does *a is a base pointer that points to a[0],a[1],a[2],a[3],a[4].

在您的第二个示例中,a 是一个指针数组。 *a[i] 是对象的值,其地址存储为数组中的第 ith 元素。 *a 在这种情况下与 a[0] 相同,它是数组中的第一个元素(它是一个指针)。

a=v //why this gives error

因为 a (在你的最后一个例子中)是一个指向数组的指针。你想赋值给a,那么你需要赋值数组v(或任何其他具有正确维数的数组)的地址;

a = &v;

这很好,您致力于理解事物,但没有什么比 a good C book 更能帮助您了.

希望这对您有所帮助。

关于c - 数组退化为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378555/

相关文章:

c - 为什么我在env中找不到我添加的环境变量

c - getch() 确实显示最近输入的字符并跳过输入的所有其他字符

c - 获取socket读操作的进度

c - LLDB 调试器无法识别在远程机器上编译的可执行符号

c - Unix Socket 发送/接收长消息

c - 如何在 C 编程中转义 & 字符?

c - 运行时检查失败 #2 - 变量 'h' 周围的堆栈已损坏

我可以从传感器读取值,然后将其添加到 RF24l01 网络的 JSON 字符串中吗

将 c 十六进制值转换为 char*

c - 指针作为函数参数?