做网站建设的电销,增加wordpress页脚小工具,石家庄网站做网站,官网推广方案seo看下面的代码
int b[10];b[4]的类型是整型#xff0c;但b的类型又是什么#xff1f;它所表示的又是什么#xff1f;一个合乎逻辑的答案是它表示整个数组#xff0c;但事实并非如此。在C中#xff0c;在几乎所有使用数组名的表达式中#xff0c;数组名的值是一个指针常量…看下面的代码
int b[10];b[4]的类型是整型但b的类型又是什么它所表示的又是什么一个合乎逻辑的答案是它表示整个数组但事实并非如此。在C中在几乎所有使用数组名的表达式中数组名的值是一个指针常量也就是数组第1个元素的地址。它的类型取决于数组元素的类型如果它们是int类型那么数组名的类型就是“指向int的常量指针”如果它们是其他类型 那么数组名的类型就是“指向其他类型 的常量指针”。
请不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特征。例如数组具有确定数量的元素而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达式中使用时编译器才会为它产生一个指针常量。
注意这个值是指针常量而不是指针变量。你不能修改常量的值。你只要稍微回想一下就会认为这个限制是合理的指针常量所指向的是内存中数组的起始位置如果修改这个指针常量唯一可行的操作就是把整个数组移动到内存的其他位置。但是在程序完成链接之后内存中数组的位置是固定的所以当程序运行时再想移动数组就为时已晚了。因此数组名的值是一个指针常量。
只有在两种场合下数组名并不用指针常量来表示
就是当数组名作为sizeof操作符或单目操作符的操作数时。sizeof返回整个数组的长度而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针而不是一个指向某个指针常量值的指针。
int a[10];
int *c;
c a[0];表达式a[0]是一个指向数组第1个元素的指针。但那正是数组名本身的值如果数组名表示整个数组这条语句就表示整个数组被复制到一个新的数组。但事实上完全不是这样实际被赋值的是一个指针的拷贝c所指向的是数组的第1个元素。所以下面这条赋值语句和上面那条赋值语句所执行的任务是完全一样的
c a;像下面的语句是非法的
b a;因为不能使用赋值符把一个数组的所有元素复制到另一个数组。必须使用一个循环每次复制一个元素。
下面这条语句
a c;c被声明为一个指针变量这条语句看上去像是执行某种形式的指针赋值把c的值复制给a。但这个赋值是非法的记住在这个表达式中a的值是个常量不能被修改。所以不能进行下面的操作
a;