想弄懂C语言中数组和指针的关系吗?这篇文章就占据你三分钟时间,看完你肯定会有收获!
数组数组声明为 数据类型 名称[ constant-size ],并将一个数据类型的一个或多个实例分组到一个可寻址的位置
constant-size可能是一个表达式,但是该表达式必须求值为常量,例如:
#定义MAX_SIZE 16
…
int列表[MAX_SIZE + 1];
C数组开始于元素0,所以像阵列定义 int a[3];将创建三个int软件,可寻址如a[0],a[1],和a[2]
请注意,即使定义很难说a[3],也没有名为a[3]
与其他变量一样,全局和静态数组元素默认情况下初始化为0,并且自动数组元素填充有垃圾值
可以使用大括号中的一个或多个值来初始化数组,例如:
int a[3] = {5, -2, 17};
ANSI C之前的编译器可能不允许在自动数组上进行初始化
如果存在初始化值列表,但未 指定常量大小,则数组的大小与初始化值的数目相同
int q[] = {1, 2, 3}; 是相同的
int q[3] = {1, 2, 3};
要声明对另一个文件中定义的数组的外部引用,请使用extern int a[];
字符串常量在C语言中,类型数组char用于表示字符串,字符串的结尾由设置为0的字节标记(也称为NUL字符)
以下定义都将其数组设置为相同的值:
int str1 [] = {‘a’,’b’,’c’,’ 0′};
int str2 [] =“ abc”;
ANSI C还允许定义像int str[3] = “abc”; ,其是相同的int str[3] = {‘a’, ‘b’, ‘c’}; (省略了最终NUL字符)
多维数组多维数组只是数组的数组(数组的数组…)
类似的多维数组m[3][2]存储在连续的存储位置中,例如m [0] [0],m [0] [1],m [1] [0],m [1] [1],m [2] [0] ,m [2] [1]
指针指针是包含变量地址的变量
有两个与指针关联的运算符:
该&操作符返回其参数的地址
该*引用它的参数通过指针访问对象指针
指针的一个简单示例是:
int i,j;
int * p; / *指向’int’的指针* /
我= 6;
p =&i; / *将`p’设置为`i’的地址* /
j = * p; / *将’j’设置为6(’i’的值)* /
* p = 5; / *将’i’设置为5 * /
指针可以包含一个地址或一个称为空指针的特殊值,该值不同于所有有效指针
指针上下文中的0将在编译时转换为空指针
还有一个预处理器宏NULL(在<stdio.h>或中 定义 <stdlib.h>)
像expression这样的表达式将导致 语句是否为空指针,因为它与相同, 并且由于在指针上下文中将其转换为空指针,因此代码将与空指针 进行隐式比较if (!ptr) statementptrif (ptr)if (ptr == 0)0ptr
同样,将评估声明,如果是不是一个空指针 if (ptr) statementptr
指针不能指向:
常数(像3,不const类似s const int a;)由于值3不具有永久的存储器地址
register 变量,因为寄存器不在内存中,因此没有内存地址
类似的表达式(8 * k),它们与常量大致相同,因为它们没有永久的内存地址
指针和数组指针可以视为数组
这段代码:
int main(void){
int a [3] = {6,3,7};
int * p =&a [0]; / *将`p’指向`a’的第一个元素* /
if(a [0] == p [0] && a [1] == p [1] && a [2] == p [2])
return 1;
else
return 0;
}
将返回1,因为指向 n的所有有效值p[n]a[n]
指针是没有,不过,同为数组
这是C语言最令人困惑的部分之一,因此这里有三种不同的方式来说明数组a 与指向p第一个元素的指针之间的区别a :
技术说明:使用直接寻址访问数组,使用间接寻址访问指针
较少技术的解释:a是一个地址, p是一个保存以下地址的地址a
极其罗嗦解释:检索值从 ,在计算机启动时的地址,移动ñ过去,并获取价值从那里; 要从中检索值,计算机将从地址开始,获取存储在其中的地址并向其添加n,然后从结果地址中 获取值a[n]ap[n]p
但是,在大多数情况下,指针和数组访问可被视为具有相同的作用,主要的例外是:
1)sizeof 运算符
sizeof(array) 返回所有元素中使用的内存量 array
sizeof(pointer)仅返回pointer变量本身使用的内存量
2)&运算符
&array是的别名,&array[0]并返回中第一个元素的地址array
&pointer 返回的地址 pointer
3)字符数组的字符串文字初始化
char array[] = “abc”将前四个元素设置 array为’a’,’b’,’c’和’ 0′
char *pointer = “abc”设置pointer为“ abc”字符串的地址(可能存储在只读存储器中,因此不可更改)
此外,无法调整数组大小或重新分配数组。