Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用指针访问一维数组和二维数组的元素_C_Arrays_Pointers - Fatal编程技术网

在C中使用指针访问一维数组和二维数组的元素

在C中使用指针访问一维数组和二维数组的元素,c,arrays,pointers,C,Arrays,Pointers,我正试图学习C语言,但我被下面的代码卡住了。从我对C的基本知识中,我了解到数组名本身就是指向数组第一个元素的指针。二维数组中的元素一行接一行地存储,所以我尝试使用数组名作为指针打印一维数组和二维数组中元素的值。但是对于code 1来说,它正如我所期望的那样工作。但是code 2给出了意外的结果(它给出了每行的起始地址)。发生这种情况的原因是什么?我认为我的理解有问题。谁能澄清这个错误 // Code 1 //------- #include <stdio.h> int main ()

我正试图学习C语言,但我被下面的代码卡住了。从我对C的基本知识中,我了解到数组名本身就是指向数组第一个元素的指针。二维数组中的元素一行接一行地存储,所以我尝试使用数组名作为指针打印一维数组和二维数组中元素的值。但是对于
code 1
来说,它正如我所期望的那样工作。但是
code 2
给出了意外的结果(它给出了每行的起始地址)。发生这种情况的原因是什么?我认为我的理解有问题。谁能澄清这个错误

// Code 1
//-------
#include <stdio.h>
int main () {
    int array[2][3] = {{5, 7, 9}, {2, 5, 77}};
    int j;
    for (j=0; j < 6; j++)
        printf("%d\t", *(array+j));
    return 0;
}

//Code 2
//------
// #include <stdio.h>
// int main () {
//  int array[6] = {5, 7, 9, 2, 5, 77};
//  int j;
//  for (j=0; j < 6; j++)
//      printf("%d\t", *(array+j));
//  return 0;
// }
//代码1
//-------
#包括
int main(){
int数组[2][3]={{5,7,9},{2,5,77};
int j;
对于(j=0;j<6;j++)
printf(“%d\t”,*(数组+j));
返回0;
}
//代码2
//------
//#包括
//int main(){
//int数组[6]={5,7,9,2,5,77};
//int j;
//对于(j=0;j<6;j++)
//printf(“%d\t”,*(数组+j));
//返回0;
// }
您应该编码

 for (int i=0; i<2; i++)
    for (int j=0; j<3; j++)
        printf("%d\t", t[i][j]);
 putc('\n');

for(int i=0;i由于多维数组在内存中是连续的,因此您只需获取指向数组第一个元素的指针,并将其用作指向一维数组的第一个元素:

int array[2][3] = { { 5, 7, 9 }, { 2, 5, 77 } };
int *p = &array[0][0];

for (int i = 0; i < 6; i++)
    printf("%d\n", p[i]);
int数组[2][3]={{5,7,9},{2,5,77};
int*p=&数组[0][0];
对于(int i=0;i<6;i++)
printf(“%d\n”,p[i]);
您最初的尝试,
*(array+j)
是错误的,因为它相当于
array[j]
,而array本身就是一个数组,因此您试图:

  • 使用
    %d
    格式说明符打印指针(
    array[j]
    ,作为数组,在传递给函数时会衰减为指针),该说明符调用未定义的行为,同时它不会打印您真正想要打印的内容

  • 访问超出边界的数组(
    array
    只有两个元素,两个元素的类型都是
    int[3]
    ,因此当您访问第二、第三、…、第五个元素时,很快就会遇到未定义的行为)


  • 对于二维数组,您的代码无效。更改

    int j;
    for (j=0; j < 6; j++)
        printf("%d\t", *(array+j));
    
    intj;
    对于(j=0;j<6;j++)
    printf(“%d\t”,*(数组+j));
    


    for(inti=0;i我认为这两种代码都不起作用

    sizeof(array)=24
    在这两种情况下。假设
    array
    从地址
    0x100
    开始,那么
    array+1
    将为您提供
    0x100+0x18=0x118
    而不是
    0x100+0x4=0x104


    0x18=24

    定义意外结果已被询问数千次。第一:数组不是指针。第二:阅读常见问题解答。在此处搜索数组和指针。您需要简单的指针:(^^^我需要使用指针。
    for (int i=0; i<2; i++)
        for (int j=0; j<3; j++)
            printf("%d\t", *(*(array+i)+j));