二维数组与指针的关系以及字符数组为什么不能直接赋值

定义一个数组就是在栈上开辟了一块连续的空间,数组名实际上是一个指向第一个元素类型的指针。

比如:

在这里定义了一个int类型的数组,对名称进行解引用就是第一个元素的内容。

我们再来看看下一个,二维数组:

二维数组与指针的关系以及字符数组为什么不能直接赋值_第1张图片

arr就是指向第一个元素类型指针,这个二维数组的元素是由三个一维数组组成的,所以arr这个数组名就是一个指向第一个元素(一维数组)的一维数组指针。

这个arr指针指向的是第一个元素(一维数组)的地址:arr=&一维数组(arr是一个一维数组指针)

对arr进行解引用结果就是这个一维数组的数组名,那么就又回到了上面的第一个案例,因为数组名是指向第一个元素类型的指针,那么再解应用解出来的值就是上面的3;

因为arr是一维数组指针,那么arr+1跨越的就是一个一维数组的(指针类型是什么,指针+1跨越的就是这个类型的字节),让我们用上面的理解方式再测试一下

二维数组与指针的关系以及字符数组为什么不能直接赋值_第2张图片

跨越了一个一维数组之后进行两次解应用结果就是第二个一维数组的首个元素了。这里的两次解应用没有加括号效果是和上面一样的,原因是因为*字符的运算顺序是从右往左。

 理解了上面的概念应该可以操控指针在数组中来回穿梭了吧~

char buf[10]={0};

buf="qweqwe";

为什么 这样的方式会出错需要strcpy(buf,"qweqwe");?

创建了一个数组,其实本质上是char *const buf;上面我们说过数组名本质上还是一个指针,不够准确应该称为不可修改的指针

这种指针是没有办法修改它指向的地址的,他一直效忠于这块创建在栈上的地址。让buf去指向别的地址那就会出错,

二维数组与指针的关系以及字符数组为什么不能直接赋值_第3张图片

错误情况就会是这种(因为buf是加了const没有办法修改的),那为什么要通过strcpy()函数来操作呢?因为strcpy是把这块地址上的内容进行修改,并没有改变具体的地址,所以需要通过strcpy()函数来完成我们想要完成的操作。

如有不足之处还望指正。

你可能感兴趣的:(c语言)