网站建设 上美天空,网站建设企业响应式网站模板,网站制作项目分析怎么做 方法,drupal与wordpress哪个容易答案#xff1a;不一样。 哪里不同#xff1f;
数组名#xff1a;数组名的值是一个指针常量#xff0c;也就是数组第一个元素的地址。
它的类型取决于数组元素的类型#xff1a;如果他们是int类型#xff0c;那么数组名的类型就是“指向int的常量指针”#xff1b;如果…答案不一样。 哪里不同
数组名数组名的值是一个指针常量也就是数组第一个元素的地址。
它的类型取决于数组元素的类型如果他们是int类型那么数组名的类型就是“指向int的常量指针”如果它们是其他类型那么数组名的类型也就是“指向其他类型的常量指针”。 总结1数组名是一个指针常量不可简单的认为是个指针。它始终指向第一个元素的地址。 那么数组在什么情况下不能作为指针常量呢
在以下两种场景下 当数组名作为 sizeof操作符 的操作数的时候此时sizeof返回的是整个数组的长度而不是指针数组指针的长度。当数组名作为 操作符 的操作数的时候此时返回的是一个指向数组的指针而不是指向某个数组元素的指针常量。除了以上两点之外数据名在其他任何情况下都是指向首元素的指针。 更进一步解释 指针和数组并不是相等的。为了说明这个概念请考虑下面两个声明
int a[10];
int *b; 声明一个数组时编译器根据声明所指定的元素数量为数组分配内存空间然后再创建数组名指向这段空间的起始位置。声明一个指针变量的时候编译器只为指针本身分配内存空间并不为任何整型值分配内存空间指针并未初始化指向任何现有的内存空间。因此表达式*a是完全合法的但是表达式*b却是非法的。*b将访问内存中一个不确定的位置将会导致程序终止。 另一方面b可以通过编译a却不行因为a是一个常量值。void test01()
{int arr[] { 1, 2, 3, 4 };//1. sizeof 2.对数组名取地址arr//以上两种情况下数组名不是指向首元素的指针//以上两种请款下数组名是数组类型//除了以上两点之外数据名在其他任何情况下都是指向首元素的指针//sizeof 可以不加括号它是c语言关键字printf(sizeof arr:%d\n, sizeof arr);printf(arr addr : %d\n, arr);printf(arr 1 addr : %d\n, arr 1); // 数组指针类型地址直接加了一个数组的长度16字节。相当于类型1。int *p arr;//数组名是一个常量指针//arr NULL;//数组下标能否是负数?//可以是负数p 3;printf(p[-1]:%d\n, p[-1]);//他们等价printf(p[-1]:%d\n, *(p - 1));//数组指针类型和数组首元素指针类型}
//如何定义一个可以指向数组的指针
void test02()
{int arr[5] { 1, 2, 3, 4, 5 };//1. 我们先定义数组类型再定义数组指针类型typedef int(ARRAY_TYPE)[5]; //typedef unsigned int u32ARRAY_TYPE myarray; // int myarray[5];//for (int i 0; i 5; i){myarray[i] 100 i;}for (int i 0; i 5; i){printf(%d ,myarray[i]);}//对数组名取地址代表指向整个数组的指针ARRAY_TYPE *pArray myarray;pArray arr;//1. *pArray 表示拿到pArray指针指向的整个数组//2. *pArray类型就是数组名指向首元素类型的指针printf(\n*(*pArray 1) : %d\n, *(*pArray 1));//2. 直接定义数组指针类型typedef int(*ARRAY_POINTER)[5];ARRAY_POINTER pArr arr;//3. 直接定义数组指针变量int(*pArrParam)[5] arr;}