指向1-D阵列和2-D阵列有什么区别?

时间:2015-05-23 10:33:35

标签: c arrays pointers

当我运行此代码时:

if(isset($_POST['jmeno']) && strlen($_POST['textarea']) > 0){
    echo "dokončeno";
}

输出:2 2

接下来我使用二维数组来解决同样的问题,但它给了我错误。

#include<stdio.h>
int main()
{
     int a[2]={1,2};
     printf("%d \t %d",*(a+1),a[1]);
}

我的想法是指向(a + 1)的地址并打印其内容。但是它给出了错误的格式错误。但是当我指向*(a + 1)时,即当我使用*(*(a + 1))时,它正在打印内容。

为什么程序在指向(a + 1)时不打印内容?指向1-D阵列和2-D阵列有什么区别?

2 个答案:

答案 0 :(得分:2)

  

当我运行此代码时[...]它输出:2 2

这是因为表达式*(a+1)a[1]是相同的:C中的方括号表达式通过将它们的操作数添加在一起(即在您的情况下为a1)和然后取消引用结果。

  

我使用二维数组来解决同样的问题,但它给了我错误。

这是因为*(a+1)a的元素属于同一类型。当aint的1D数组时,其元素为int s。当aint的二维数组时,其元素是int的一维数组。在第二个示例中,您尝试将int的一维数组传递给printf,格式说明符需要单个int,这会导致错误。

  

我的想法是指出(a + 1)的地址并打印其内容。

然后你需要再添加一个解除引用级别(即一个星号)到#34; counter&#34; 1D阵列:

printf("%d \t %d",**(a+1),a[1][0]);
//                 ^

demo.

获取a[1][1]的表达式稍微复杂一些:

printf("%d \t %d",*(*(a+1)+1),a[1][1]);

demo.

答案 1 :(得分:1)

2D数组实现为数组数组;因此,在第二种情况下,您尝试printf指针(a[1],而非a[1][0])。如果取消引用该指针,它将起作用:

printf("%d \t %d", **(a + 1), a[1][0]);