以下声明:

100

定义为x is an integer pointer to an integer array of 10 elements.

Question 1:这不是意味着x最初指向由10个整数组成的数组的第一个元素吗?如果是这样,那么这与简单的100有何不同?

Question 2 : If 100 is different, then how is it different and what are some instances of its practical usage?

Question 3:我试图写一个简单的程序访问,写入和打印数组元素.

#include <stdio.h>

void main()
{
    int (*x)[12], i;
    for(i = 0; i <= 11;)
    {
        (*x)[i] = i;
        printf("%d\n", (*x)[i++]);
    }
}

当我运行它时,我一直得到segmentation fault分.我知道,当我试图访问我无法访问的内存时,会出现分段错误.但我只访问了我初始化的12个元素.那么,为什么我的程序会因分段错误而退出?此外,我是否正确访问了数组(100)以及是否有其他访问方法?

推荐答案

对于符合C标准的启动器,无参数的主要功能应标记为

int main( void )

在所示的程序中,您声明了一个未初始化的指针

int (*x)[12], i;

具有不确定值.所以解引用指针

(*x)[i] = i;

导致未定义的行为.

相反,你可以写例如

#include <stdio.h>

int main( void )
{
    enum { N = 12 };
    int a[N];

    int (*x)[N] = &a;

    for ( size_t i = 0; i < N; i++ )
    {
        (*x)[i] = i;
        printf( "%d\n", (*x)[i] );
    }
}

虽然如果这样编写,程序看起来会更简单

#include <stdio.h>

int main( void )
{
    enum { N = 12 };
    int a[N];

    int *x = a;

    for ( size_t i = 0; i < N; i++ )
    {
        x[i] = i;
        printf( "%d\n", x[i] );
    }
}

在本声明中

int *x = a;

隐式转换为指向其类型int *的第一个元素的指针.

在本声明中

int (*x)[N] = &a;

初始化表达式&a已经是int ( * )[N]类型的指针.

所以在表达式中

(*x)[i] = i;

子表达式*x产生数组a的左值.所以事实上,上面的表达式等价于

a[i] = i;

请注意这两个声明中的内容

int *x = a;

int ( *x )[N] = &a;

指针x存储由数组a占用的存储器区段的起始地址,但具有不同的类型.解引用第一个指针将得到数组a的第一个元素.解引用第二个指针将得到整个数组本身.

C++相关问答推荐

C strlen on char array

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

GCC:try 使用—WError或—pedantic using pragmas

C指针算法在函数参数中的应用

将整数的.csv文件解析为C语言中的二维数组

试图从CSV文件中获取双精度值,但在C++中始终为空

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

在Apple Silicon上编译x86的Fortran/C程序

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

指向不同类型的指针是否与公共初始序列规则匹配?

搜索使用int代替time_t的用法

合并对 struct 数组进行排序

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

在下面的C程序中,.Ap0是如何解释的?

如何使用WRITE()以指针地址的十六进制形式写入标准输出

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

如何使用 raylib 显示数组中的图像

将十六进制值或十进制值分配给 uint16_t 有什么区别?