LinuxC预习第五章——数组和指针

1、数组和指针的不同
答:
数组和指针在很多情况下是可以等效使用,但是本质还是不同的。比如在定义了一个数组 char a1[MAX]; 之后,不能声明一个 extertn char *a1;

2、数组使用常见一些问题

2.1 数组下标都是从0开始的吗?
答:
不都是。在使用数组的时候要注意数组的下标是从0开始的,可以人为弄一个从1开始的数组,但是会留下很多隐患而且不方便阅读。

2.2 数组后面的第一个是否可以使用?
答:
可以,但是不推荐。数组后面的第一个元素的地址最好不要特意使用,因为不知道里面是否已经存储了内容,最后可能会造成无法预计的后果。

2.3 是否可以直接用sizeof看一个数组大小?
答:
不可以。无法通过sizeof()函数直接查看一个数组的大小,因为数组参数表示的是第一个元素的指针,这样是无法直接使用的。

2.4 数组和指正哪个更容易被访问?
答:
大多数情况下是指针。
细节方面,数组和指针进行比较,指针更容易被访问。因为在访问数组的时候还要把数据类型大小和摆放的第几位数i相乘,而乘法是比较花费时间的。
指针只会在开始的时候计算一次参数地址,此后在循环的时候直接调用,而且参数地址在循环中是不变的。所以相较于数组,直接调用指针更节省计算量。

2.5 为何const说明不能定义一个数组的大小?
答:
C语言中,定义数组必须要用一个常量表达式,例如#define MAX 512 。但是const int max=512; char buffer[max];是不可取的,因为初始化了的const int 变量不是一个常量表达式。然后这个用法在C++却是合法的。

2.6 字符串和数组的区别
答:
两者核心区别是,字符串以"\0"作为结尾,而数组不需要。

字符串有些特殊的用法,例如"Hello,"world和"Hello,world"等效,因为NULL后面紧跟一个字符串,编译程序会把他们当做一个长字符串处理。

“C的幽默”:简单来讲,给两个不同的地址指针指向一个相同内容字符串。理论上相同的内容应该分配不同的地址,但是编译程序依旧可能为了省事只分配一个地址。

char *p="message";
char *q="message";
p[4] = '\0';

这段程序根据编译方式的不同,*q所指的字符串可能是"message"也可能是"mess"。

3 指针
3.1 指针的大小是多少?
答:
指针代表地址,32位处理器32位,4个字节;64位处理器8个字节。

3.2 指针的运算
指向相同数组元素的指针是可以进行减法的和比较的。两个指针可以进行是否相等的比较,结果无非两种。

3.3 最多可以的指针层数
理论上可以使无限层。实际中,ANSI C标准要求任何编译器起码能处理12层的间接引用。

3.4 指针数组和数组指针
在定义数组的时候在数组参数前面加个‘*’号,则定义出指向指针的数组,在“*参数”外面加个括号就构成了指向数组的指针。

4 复杂指针
主要有一个右左法则,从最里面括号开始看,跳出看右边,看到底再往左边看。结束后跳出一层括号重复上述行为。

猜你喜欢

转载自blog.csdn.net/qq_43257912/article/details/82985674