指针和数组的区别
# 指针和数组的异同
在 C/C++中,指针和数组这两个类型基本等价,指针名和数组名都表示的是地址,使用解除引用运算符*
,可以得该地址指向的值。
char a[5] = {'q', 'x', 'r', 'v', 't'};
char* b = "abcd";
1
2
2
不同的是,数组名代表的是数组中第一个元素的地址,指针名就是指针指向的整个内存块的地址。
对数组名应用取地址运算符&
,得到的是整个数组的地址,虽然数组的地址和数组的第一个元素的地址是一样的,但从概念上,&a[0]
是一个 1 字节内存块的地址,而&a
是一个 5 字节的内存块地址,tell+1
是将地址值加了 1(因为是 char 类型,如果是 short,那地址值就加了 2),而&a + 1
是将地址加了 5。
对指针名和数组名进行指针运算都是以其指向的类型(数组中元素的类型)的字节数为单位的。
在很多情况下,可以使用相同的方式使用指针名和数组名,比如可以使用方括号[]
和*
去获取元素的值。不同的是,指针名的值可以改变,但数组名却是常量
;另外一点是,指针变量存的是一个指针,只是这个指针指向的是一块内存,所以对指针变量应用sizeof
,不会得到其指向的内存块的大小,而是指针的长度,即使指针指向的是一个数组,对数组名而言,就不一样了,对其运行sizeof
或得到数组的长度。
在指针和数组作为函数形参时,都是以指针变量的形式传递的。无论是下面的哪种方式:
void func1(char* c)
{
...
}
void func2(char c[])
{
...
}
void func3(char c[5])
{
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上次更新: 2022/06/17, 07:22:19