重庆网站营销,网站容易出现的问题吗,最有效的网站推广方法,上海网站设计开发对于一个数组#xff0c;如 int a[4]; 如果只是给出数组名a#xff0c;编译器不知道该取该数组的第几个元素#xff0c;因此编译器不会自动取值#xff0c;而是返回该数组的首地址#xff08;第一个元素的地址#xff09;。其实#xff0c;数组名a就是数组本身#xf… 对于一个数组如 int a[4]; 如果只是给出数组名a编译器不知道该取该数组的第几个元素因此编译器不会自动取值而是返回该数组的首地址第一个元素的地址。其实数组名a就是数组本身并不是数组的首地址只是当只是给出了数组名a的时候而又同时需要取值时数组名a才会被隐式转换为该数组的首地址。因此int *pa;和int *pa的效果是一样的只是前者是显示的而后者是隐式的。 例如数组名a在以下情况就不是数组的首地址的1.sizeof(a) 得到的结果为16即a是一个数据类型长度为4的int数组类型是数组本身没有进行隐式转换2.a 表示数组的首地址并不是指针的指针而是指向长度为4的int数组的指针一个常量指针其指针类型为 in (*)[4]此处4不能省略因为指向不确定长度的指针 是没有意义的编译器若不知道该指针指向的类型就无法编译指针的加减法运算(指针指向类型的长度未知加减法的位移量就未知。int (*p)[4]a; 定义一个指针p并初始化为数组a的地址等价于:int *pa 3. C中取引用时a也不是指针。
char* test2()
{char p[] hello world;return p;
} //错误代码char* test2()
{char *p hello world;return p;
} 对于以上代码char p[ ] hello world;与char *p hello world;是有着本质区别的前者首先定义了一个数组p且用后面的字符串初始化该数组p数组p的作用域为该函数内部数组生存期和作用域与声明方式相关。而且该数组没有 const 资格符字符串内容是可以修改的。这个数组首地址不能在函数中返回因为函数结束的同时p已经被销毁了除非声明用了 static 。对于后者声明一个指针。字符串字面量本身成为一个静态存储期的数组它再隐式转换成指针以初始化声明的指针。这个字符串是不可修改的修改会导致未定义行为数组本身可放在只读内存区。它的首地址可以在函数中返回。 对于函数名其原理与上面基本相同。函数名其实并不是函数的入口地址只是被隐式转换了。函数名只是函数本身。