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;
}