首页 > 其他分享 >c指针详解(2)--- 指针与数组

c指针详解(2)--- 指针与数组

时间:2024-07-01 12:08:40浏览次数:1  
标签:静态 --- 详解 内存 数组 array 分配 指针

在大致了解了c语言中变量在内存中的分配、存活等方面后,我们再来看看数组在内存中又是如何呈现的。
这里我们就只讨论静态数组,动态数组涉及到动态内存分配,这里就不详细展开了。
那么什么是静态数组呢?要理解这个数据结构,我们可以将其切分为两个概念:静态数组

  • 数组:数组其实就是一系列具有相同类型的元素的集合。
  • 静态:静态,我们可以将其理解为固定的,不会变化的。

然后,我们将其组合起来---静态数组:具有相同类型且数量固定的元素的集合。

在编程中,我们可以发现int array[5];这样的声明是正确的,但有时候,出于某种原因,我们要在程序执行中才能去确定数组的元素,那你可能会这样声明int array[number]; // number是一个变量,但这样却报错了,这是为什么呢?
原因其实就是静态,计算机会在其运行前就分配好内存空间,所以它的元素个数可以少,但决不能超出,因为计算机不会为这个数组再次分配内存。

int array[5];还是以这个为例子,计算机分配给这个数组的内存其实就是分配5个连续的内存块给5个整数。注意,这里是连续的内存块,而不是分散的内存块,所以这与单纯的给每个整数分配内存块还是有区别的。而连续的原因其实就是因为数组是一个顺序表,需要支持顺序访问,也就是array[0], array[1],..., array[4]这种下标访问的形式。

那么指针与数组的联系又是什么呢?c语言中数组名可以作为指针使用,也就是说int array[5];中array其实是一个整型指针,指向第一个整数,然后数组的下标访问其实也就是指针的偏移操作。

我们可以对比下array[1]*(array + 1),其实这两个是一样的,只是表现形式不同。

不过需要注意的一点是,数组名作为指针是不能作为左值的,也就是不能改变它的指向。反过来想一想,你把一个数组在内存中的标识符删掉了或者指向其他的地方,这个数组还能访问吗?

在指出一点,数组作为函数参数时,实际上是将其看成一个指针,指向数组的首地址。

接着,我们再来说一说字符数组,也就是字符串。

  • char array[2] = {'h', 'i', '\0'};这一种声明方式要显式地指出以\0结尾,但我们可以对其修改,比如array[0] = 'o';这是合法的,原因是因为这个数组是被分配在stack区内的,可以修改。
  • cahr *array = "hi";这一种声明方式显式地指出以\0结尾了,它会自动添加,但我们无法对其进行修改,比如array[0] = 'o';这是非法的,原因是因为这个数组是被分配在常量区,不能修改。

还需注意的一点是,当你将数组作为函数参数时,需要考虑下这个数组是否可以修改(被分配在stack区还是常量区),从而避免函数内的非法操作。

标签:静态,---,详解,内存,数组,array,分配,指针
From: https://www.cnblogs.com/winter-z/p/18277221

相关文章