C 指向数组的指针

C 指向数组的指针,c,C,我使用一个指向4个整数数组的指针作为int(*ptr)[4] 使用以下代码,其中m使用此指针指向二维数组 int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*ptr)[4]= arr[4]; int m= (*ptr)[2]; “m”的值是多少 我需要找到元素arr[1][2]的值,如何使用指针ptr获取它?ptr没有指向任何东西,甚至可能没有编译,因为[4]超出了原始数组的[3]或[4]的边界 如果需要查找arr[1][2],则

我使用一个指向4个整数数组的指针作为int(*ptr)[4]

使用以下代码,其中m使用此指针指向二维数组

int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int (*ptr)[4]= arr[4];

int m= (*ptr)[2];
“m”的值是多少


我需要找到元素arr[1][2]的值,如何使用指针ptr获取它?

ptr没有指向任何东西,甚至可能没有编译,因为[4]超出了原始数组的[3]或[4]的边界


如果需要查找arr[1][2],则需要int(*ptr)[4]=arr[1];int m=ptr[2]

Ptr没有指向任何东西,甚至可能没有编译,因为[4]超出了原始数组的[3]或[4]的边界


如果需要查找arr[1][2],则需要int(*ptr)[4]=arr[1];int m=ptr[2]

多维数组实际上是一维数组,有一点通顺性。 您对ptr的初始化不是地址。应该是的

int *ptr[4] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};
你也可以不使用4,直接使用

int *ptr[] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};
我对下面的代码做了一些修改。请注意带有printf的两个部分。它们应该有助于说明这些值在内存中的实际排列方式

#define MAJOR 3
#define MINOR 4
int arr[MAJOR][MINOR]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int (*ptr)[4];
int *p = &arr[0][0];

// init ptr to point to starting location in arr
for(i = 0; i < MAJOR; i++) {
    ptr[i] = &arr[i][0];
}

// print out all the values of arr using a single int *
for(i = 0; i < MAJOR * MINOR; i++) {
    printf(" %d", *(p + i) );
}

for(i = 0; i < MAJOR; i++) {
  for(j = 0; j < MINOR; j++) {
     printf( " %d", *(p + i * MAJOR + j) );
  }
  printf("\n");
}
#定义专业3
#定义小四
int arr[大调][小调]={{1,2,3,4},{5,6,7,8},{9,10,11,12};
int(*ptr)[4];
int*p=&arr[0][0];
//初始化ptr以指向arr中的起始位置
对于(i=0;i
多维数组实际上是一种一维数组,有一点通顺性。 您对ptr的初始化不是地址。应该是的

int *ptr[4] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};
你也可以不使用4,直接使用

int *ptr[] = { &arr[0][0], &arr[1][0], &arr[2][0], &arr[3][0]};
我对下面的代码做了一些修改。请注意带有printf的两个部分。它们应该有助于说明这些值在内存中的实际排列方式

#define MAJOR 3
#define MINOR 4
int arr[MAJOR][MINOR]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int (*ptr)[4];
int *p = &arr[0][0];

// init ptr to point to starting location in arr
for(i = 0; i < MAJOR; i++) {
    ptr[i] = &arr[i][0];
}

// print out all the values of arr using a single int *
for(i = 0; i < MAJOR * MINOR; i++) {
    printf(" %d", *(p + i) );
}

for(i = 0; i < MAJOR; i++) {
  for(j = 0; j < MINOR; j++) {
     printf( " %d", *(p + i * MAJOR + j) );
  }
  printf("\n");
}
#定义专业3
#定义小四
int arr[大调][小调]={{1,2,3,4},{5,6,7,8},{9,10,11,12};
int(*ptr)[4];
int*p=&arr[0][0];
//初始化ptr以指向arr中的起始位置
对于(i=0;i
有多种方法可以访问元素
arr[1][2]
的值

下面代码中使用的方法称为指针到指针。通过将
pa[]
的第一个元素的地址存储在
pb
中,可以使用
pb
访问
aa[]
的元素。可以使用数组表示法
aa[1][2]
,也可以使用指针表示法
*(*pb+1)+2)
。这两种表示法都产生了相同的结果

#include<stdio.h>

int main()
{
 int aa[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
 int *pa[3];

 for(int i=0;i<3;i++)
 pa[i]=aa[i];
 pb=pa;

 printf("pb[1][2]=%d\n",pb[1][2]); /*Array Notation*/
 printf("arr[1][2]=%d",*(*(pb+1)+2)); /*Pointer Notation*/
}
#包括
int main()
{
int aa[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12};
int*pa[3];

对于(int i=0;i,有多种方法可以访问元素
arr[1][2]
的值

下面代码中使用的方法称为指针指向指针。通过将
pa[]
的第一个元素的地址存储在
pb
中,可以使用
pb
访问
aa[][]
的元素。可以使用数组表示法
aa[1][2]
,也可以使用指针表示法
*(*pb+1)+2)
。这两种表示法都产生了相同的结果

#include<stdio.h>

int main()
{
 int aa[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
 int *pa[3];

 for(int i=0;i<3;i++)
 pa[i]=aa[i];
 pb=pa;

 printf("pb[1][2]=%d\n",pb[1][2]); /*Array Notation*/
 printf("arr[1][2]=%d",*(*(pb+1)+2)); /*Pointer Notation*/
}
#包括
int main()
{
int aa[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12};
int*pa[3];


for(int i=0;i)下次查看您的代码。这是一个家庭作业问题吗?如果是,请这样标记,并告诉我们您尝试了什么以及您的确切问题是什么。还有,是什么阻止了您运行和尝试(顺便说一句,它不起作用)。在第二行“arr[4]'这不是一个超出范围的索引吗?arr的最大大小已声明为3。因此,最大索引应为2,因为它是基于零的。使ir arr[2]即使它没有给出正确的输出…ptr=arr[2]给出一个错误。为什么???下次格式化你的代码。这是一个家庭作业问题吗?如果是的话,就这样标记它,告诉我们你尝试了什么,你的确切问题是什么。还有,是什么阻止你运行它和尝试(顺便说一下,它不会工作)。在第二行“arr[4]'这不是索引超出范围吗?arr的最大大小已声明为3。因此,最大索引应为2,因为它是基于零的。使ir arr[2]即使它没有给出正确的输出…ptr=arr[2]给出错误..为什么?
int(*ptr)[4]=&arr[1];int m=(*ptr)[2]
注意额外的
&
*
。您的变体甚至不会编译。嘿,安德烈告诉我一件事int(*ptr)[4]=&arr[4]将超出范围?@nitinpuri,是的,它将超出范围-
arr
只有3个元素,因此最大索引是2。arr是用大小[3]和[4]声明的。只有一个索引,它引用第一个大小[3]。由于C/C++中的数组是基于零的,因此允许的最大值为2。为了澄清DeadMG引用的内容,需要使用“&”来获取指定索引处的arr引用。第一部分已完成,但int m=(*ptr)[2]未指向4元素数组中的元素3。
int(*ptr)[4]=&arr[1];int m=(*ptr)[2];
注意额外的
&
*
。您的变体甚至不会编译。嘿,安德烈告诉我一件事int(*ptr)[4]=&arr[4]将越界?@nitinpuri,是的,它将越界-
arr
只有3个元素,因此最大索引是2.arr,声明大小为[3]和[4]。由于只有一个索引,它引用了第一个大小[3]。由于C/C++中的数组是基于零的,因此允许的最大值为2。为了澄清DeadMG所指的内容,需要使用“&”来获取arr a的引用