趣谈指针和二维数组指针

  最近在复习C语言的时候,很多人对指针,指针变量以及二维数组指针理解不了。

指针与指针变量的区别:

指针:指针就是地址,地址就是指针。是一个确定的

指针变量:指针变量是一个特殊的变量,用来存储指针(地址)的变量

联系:形如 int a=1;这里a是一个变量,1是个确定的值,可以说左边的a是变量右边是值,同样的道理 int *p=&a;这里左边的p是指针变量,右边就是指针(地址)。不过,通常我们叙述的时候会把指针变量简称为指针实际上两者并不是同一个慨念。

int main()
{
    int a,*p;
    a=5;
    p=&a;
    *p=100;
    printf("a=%d %d\n",a,*p);

}

输出:100 100;

有人不解a为什么是100了,实际上他们指向的同一内容。具体内容改变,肯定改变

举例:

教学楼房间地址301(301就是地址,相当于&a)。上面挂这着牌"校长办公室(这门牌就是变量a)"。突然来了个小明想去校长办公室,别人告诉他校长办公室在301(相当于p=&a=301)。于是他找到了校长办公室。他的职责就是为办公室添加椅子。原来校长办公室有五把椅子。小明找到301将里面的椅子增加到100吧(*p=100);现在问a的值等于多少?就是问挂着“校长办公室”的房间有多少把椅子,问*p的等于多少就是问301有多少椅子。椅子数肯定是一样的。

二维数组的地址与指针:

这对初学者来说比较难理解。先来看一段程序:

int main()
{
    int a[10][10];
    printf("%d %d %d\n",a[0],&a[0],&a[0][0]);
    printf("%d %d\n",a,*(a));
    printf("%d %d\n",a+1,*(a+1));
    printf("%d %d\n",&a[0][1],*a+1);

}

输出结果:

*(a+i)=a+i 以及a[0]=&a[0]  相等??

估计你早已经蒙圈,一个地址和内容怎么可能相等。事实上确实如此,a+i并不是一个变量,*(a+i)也不是一个指针变量,a+i是一个常量 a+i这个指针实际是没有一个内存单元来存储的*(a+i)是一个常量指针

a+i还是2维指针,*(a+i)则是一维指针。编译器对它们的解析和操作是不一样的

a记录是首址,所以a+1,相当偏移一个单元(行),而又因为a是二级指针,所以*(a+1)之后跳到了一维指针所以取得的还是a偏移一个单元的地址(很难理解。。就是*(a+i)取值了变成了一个地址。它的值就是他的地址)

这里方便理解记住*(a+1)的*的作用是将行指针转换为列指针。没有*表示的时候就是行指针

如a+1,就是第一行首地址

如果加上了*就要从行列分析

如*(a+1)就是相当与*(a+1)+0表示指针变量先找了第一行,加上个*后指针变为列指针。开始在该行上寻找偏移的地址,偏移的地址为0即表示的是第一行0列的地址也就是&a[0][1];

a[i] 就表示的是第 i 行的首地址,也就是 a[i][0]这个元素所在的地址;

&a[i] 取得a[i][0]的地址,代表的是i行0列的地址,是 a[i][0]的地址。

所以a+1=*(a+1)=a[1]=&a[1]=&a[1][0]

猜你喜欢

转载自blog.csdn.net/Warkey1998/article/details/82817629