C 为什么[2][3]是声明int*A[10]的有效左值;

C 为什么[2][3]是声明int*A[10]的有效左值;,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,为什么A[2][3]是有效的左值。正如我在A[2]中所理解的,我们存储一个指向整数的指针(单个整数而不是数组)。那么A[2][3]中的[3]如何访问它呢?希望这段代码能够演示如何使用int指针数组 目标是创建一个足以容纳30个整数的缓冲区。然后为分配的缓冲区的每三个地址分区分配一个int指针 因此,如果[0]设置为地址0x562437eea260。 然后,这意味着[1]将被设置为地址0x562437eea26c,大约(sizeof(int)*3),相隔12个字节 然后可以通过调用[i][j]来设

为什么
A[2][3]
是有效的左值。正如我在
A[2]
中所理解的,我们存储一个指向整数的指针(单个整数而不是数组)。那么
A[2][3]
中的
[3]
如何访问它呢?

希望这段代码能够演示如何使用int指针数组

目标是创建一个足以容纳30个整数的缓冲区。然后为分配的缓冲区的每三个地址分区分配一个int指针

因此,如果[0]设置为地址0x562437eea260。 然后,这意味着[1]将被设置为地址0x562437eea26c,大约(sizeof(int)*3),相隔12个字节

然后可以通过调用[i][j]来设置指针地址处的值;假设i是从int指针数组中选择地址的索引,j是1、2或3,具体取决于您希望访问的数字

预期产出:

int *A [10];
在我的示例中,我将所有整数设置为随机值

a[0] = 0x562437eea260
a[0][0] = 2
a[0][1] = 3
a[0][2] = 5

a[1] = 0x562437eea26c
a[1][0] = 3
a[1][1] = 3
a[1][2] = 7

a[2] = 0x562437eea278
a[2][0] = 9
a[2][1] = 2
a[2][2] = 3
#包括
#包括
#包括
#定义未使用的(x)((无效)(x))
#定义总整数指针10
#定义每个指针的整数3
int main(常量int argc、常量字符**const argv、常量字符**const envp){
未使用(argc);未使用(argv);未使用(envp);
//种子随机数发生器
srand((无符号整数)时间(0));
//创建一个包含10个int指针的数组
int*a[TOTAL_int_POINTERS]={0};
//为整数分配内存
int*ptr=(int*)malloc((sizeof(int)*总int\u指针)*每指针int\u);
如果(ptr==NULL){
fprintf(stderr,“未能为整数分配内存!\n”);
返回(int)退出_失败;
}
//为每个分配的空间分配指针和值
for(无符号整数i=0;i
正如注释中已经指出的,编译器只管理指针,不知道数据的实际结构。您可以使用方括号或指针算术通过索引访问数组元素:

A[i][j]
相当于
*(A[i]+j)
,也相当于
*(*(A+i)+j)

请注意,您必须确保正在访问的内存实际上在数组边界内

进一步阅读:


事实上,
x
指向一个
int
并不意味着该
int
旁边没有更多的
int
,在它之前或之后,或者两者都有

如果我有一个数组
inta[10]
,那么
&a[5]
指向数组的元素5,
和[5]-1
&a[5]+1
指向元素4和6。如果我将
&a[5]
作为子例程的参数
int*x
传递给该子例程,并且该子例程知道存在其他元素,则它可以使用
x[1]
引用数组的元素6,使用
x[-1]
引用元素4


给定
int*A[10]
,我可以分配任意多的内存,并将其地址分配给
A[0]
。然后
A[0][0]
为该内存中的第一个
int
指向空格,
A[0][1]
为下一个
int
指向空格,依此类推。

为什么代码尝试这样做?这是一个家庭作业问题?C没有边界检查。指向单个
int
值的指针可以看作是单个元素的数组,超出任何数组的界限都会导致未定义的行为。你的程序有责任不越界。@Someprogrammerdude那么拥有int*类型的好处是什么?不。第一个(
int*a[10];
)将
a
声明为指向
int
的十个指针的数组。第二个(
int[]*A[10];
)语法无效。如果指针指向单个值或数组的第一个元素是程序逻辑的一部分,编译器本身并不关心(甚至不知道)。您可能应该花一些时间阅读一些书籍,以了解有关指针和数组的更多信息,或者请老师/导师帮助您(stackoverflow.com不是一个辅导网站)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define UNUSED(x)((void)(x))

#define TOTAL_INT_POINTERS 10
#define INTS_PER_POINTER 3

int main(const int argc, const char** const argv, const char** const envp) {
    UNUSED(argc); UNUSED(argv); UNUSED(envp);

    // Seed random number generator
    srand((unsigned int)time(0));

    // Create and array that will hold 10 int pointers
    int *a[TOTAL_INT_POINTERS] = {0};

    // Allocate memory for integers
    int *ptr = (int *)malloc((sizeof(int) * TOTAL_INT_POINTERS) * INTS_PER_POINTER);
    if(ptr == NULL) {
        fprintf(stderr, "Failed to allocate memory for integers!\n");
        return (int)EXIT_FAILURE;
    }

    // Assign pointers and values to each allocated space
    for(unsigned int i = 0; i < TOTAL_INT_POINTERS; i++) {
        // Assign pointer array member
        a[i] = ptr + (i * INTS_PER_POINTER);

        // Print assigned address
        printf("a[%d] = %p\n", i, a[i]);

        // Give 3 integers their values and print out the result
        for(unsigned int j = 0; j < INTS_PER_POINTER; j++) {
            a[i][j] = rand() % 10;
            printf("a[%d][%d] = %d\n", i, j, a[i][j]);
        }

        putchar('\n');
    }

    // Free up used memory
    free(ptr);

    return (int)EXIT_SUCCESS;
}