我有以下代码:
#include<stdio.h>
void func(int [][3]);
int main(){
int a[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
func(a);
printf("%d", a[2][1]);
}
void func(int b[][3]){
++b;
b[1][1] = 17;
}
Run Code Online (Sandbox Code Playgroud)
问题:
我希望printf语句打印8但是打印17.
我不明白为什么?
谢谢
需要注意++b的func(),在此之后,b(最初指向a[0][0]),现在指向a[1][0],所以下面
b[1][1] = 17;
Run Code Online (Sandbox Code Playgroud)
a[2][1]在外面修改.
您可以使用扩展代码查看代码的内存布局:
#include <stdio.h>
void print_addr(int b[][3])
{
for (int i = 0 ; i < 3 ; i++) {
for (int j = 0 ; j < 3 ; j++)
printf("%p ", &b[i][j]);
printf("\n");
}
}
void func(int b[][3]){
print_addr(b);
printf("sizeof(b): %d sizeof(b[0][0]) %d\n", sizeof(b), sizeof(b[0][0]));
++b;
print_addr(b);
b[1][1] = 17;
}
int main()
{
int a[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
func(a);
printf("%d\n", a[2][1]);
}
Run Code Online (Sandbox Code Playgroud)
它将显示在您进行移位后,b[1][1]地址将指向a[2][1]单元格,因为b它是指向数组行的指针并向下b++移动一行.
你也可以通过指针传递值,因此函数func访问位于相同的内存a.
如果我建议,只需在学习的同时打印所有内容,并查看这个精彩的演示文稿:http://www.slideshare.net/olvemaudal/deep-c?qid = 1fcb7c99-e916-4bcd- baa2-1a1f974d1c68