郑州网站建设易云巢,网站被主流搜索引擎收录的网页数量,服务类网站建设服务公司,自己做的一个网站怎么赚钱文章目录 1. 函数声明数组参数2. 数组初始化方式2.1 静态初始化2.2 自动变量初始化 2.2 字符数组的初始化 1. 函数声明数组参数
下面两个函数原型是一样的#xff1a;
int strlen( char *string );
int strlen( char string[] );可以使用任何一种声明#xff0c;但哪个“更… 文章目录 1. 函数声明数组参数2. 数组初始化方式2.1 静态初始化2.2 自动变量初始化 2.2 字符数组的初始化 1. 函数声明数组参数
下面两个函数原型是一样的
int strlen( char *string );
int strlen( char string[] );可以使用任何一种声明但哪个“更加准确”呢 答案是指针。因为实参实际上是个指针而不是数组。同样表达式sizeof string的值是指向字符的指针的长度而不是数组的长度。 为什么函数原型中的一维数组形参无需写明它的元素数目 因为函数并不为数组参数分配内存空间。形参只是一个指针它指向的是已经在其他地方分配好内存的空间。这个事实解释了为什么数组形参可以与任何长度的数组匹配——它实际传递的只是指向数组第1个元素的指针。另一方面这种实现方法使函数无法知道数组的长度。如果函数需要知道数组的长度它必须作为一个显式的参数传递给函数。
2. 数组初始化方式
数组初始化的方式类似于标量变量的初始化方式——也就是取决于它们的存储类型。
2.1 静态初始化
存储于静态内存的数组只初始化一次也就是在程序开始执行之前。程序并不需要执行指令把这些值放到合适的位置它们一开始就在那里了。这个魔术是由链接器完成的它用包含可执行程序的文件中合适的值对数组元素进行初始化。如果数组未被初始化数组元素的初始值将会自动设置为零。当这个文件载入到内存中准备执行时初始化后的数组值和程序指令一样也被载入到内存中。因此当程序执行时静态数组已经初始化完毕。
2.2 自动变量初始化
由于自动变量位于运行时堆栈中执行流每次进入它们所在的代码块时这类变量每次所处的内存位置可能并不相同。在程序开始之前编译器没有办法对这些位置进行初始化。所以自动变量在缺省情况下是未初始化的。如果自动变量的声明中给出了初始值每次当执行流进入自动变量声明所在的作用域时变量就被一条隐式的赋值语句初始化。这条隐式的赋值语句和普通的赋值语句一样需要时间和空间来执行。数组的问题在于初始化列表中可能有很多值这就可能产生许多条赋值语句。对于那些非常庞大的数组它的初始化时间可能非常可观。 如何选择初始化方式静态初始化 or 自动变量初始化 这个问题等同于问当数组的初始化局部于一个函数或代码块时在程序的执行流每次进入该函数或代码块时每次都对数组进行重新初始化呢。如果答案是否定的你就把数组声明为static这样数组的初始化只需在程序开始前执行一次。
2.2 字符数组的初始化
字符数组初始化的时候可以是这样
char message[] { H, e, l, l, o, 0 };这个方法当然可行。但除了非常短的字符串这种方法确实很笨拙。因此语言标准提供了一种快速方法用于初始化字符数组
char message[] Hello;尽管它看上去像是一个字符串常量实际上并不是 。它只是前例的初始化列表的另一种写法。 如何分辨字符串常量和这种初始化列表快速记法呢 它们是根据它们所处的上下文环境进行区分的。 ①当用于初始化一个字符数组时它就是一个初始化列表。 ②在其他任何地方它都表示一个字符串常量。
char message1[] Hello;
char *message2 Hello;这两个初始化看上去很像但它们具有不同的含义。前者初始化一个字符数组的元素而后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置如下图所示 参考
《C和指针》