我们知道数组名是一个常量,不能够做修改操作,但是在实际中,发现数组名做参数的时候却做了自增操作,为此专门写了个简单代码测试了一下
1、首先模拟一下数组名自增时报错的情况
源码:
报错:
结论:如果对数组名进行了赋值操作就会报lvalue required as increment operand,意思是对左值进行了增加操作
2、模拟一下数组名作参数时,不报错的情况
源码:
编译日志:
结论:
①实参数组名代表该数组首元素的地址,而形参是用来接收从实参传递过来的数组首元素地址的。因此,形参应该是一个指针变量(只有指针变量才能存放地址)。实际上,C编译都是将形参数组名作为指针变量来处理的。
新的疑问1:如果将数组名作为形参时是将数组名作为指针变量来处理,为什么不直接将形参携程数组指针变量的形式?
比如:原数组char * arr[];
形参应该为:(char *)(*array)[];
新的疑问2:arr++不会越界吗
在 C 语言中,`char *arr[]={"abc", "abcd", "abcde"};` 这个定义声明了一个指向字符指针的数组(也称为字符串数组,尽管这里并没有显式的 `char` 数组,但字符串字面量在 C 中实际上是由指向它们首字符的指针表示的)。
这里,`arr` 是一个数组,它包含三个元素,每个元素都是一个 `char*` 类型的指针。这三个指针分别指向字符串字面量 `"abc"`、`"abcd"` 和 `"abcde"` 的首字符。因此,这个数组里存储的是指向字符串字面量的指针(即地址)。
具体来说:
* `arr[0]` 是一个指向字符串 `"abc"` 的首字符 `'a'` 的指针。
* `arr[1]` 是一个指向字符串 `"abcd"` 的首字符 `'a'` 的指针。
* `arr[2]` 是一个指向字符串 `"abcde"` 的首字符 `'a'` 的指针。
这些字符串字面量通常存储在程序的只读数据段(read-only data segment)中,所以你不应该尝试修改它们的内容(尽管有些编译器和平台可能允许你这么做,但这是未定义的行为)。