在平时使用数组和指针的时候,感觉他们的使用很类似。那么数字和指针在使用的过程中到底有什么区别呢?
下面通过一个例子来简单分析一下。
char str1[] = "abcdef";
char *str2 = "123456";
int i;
for(i=0; i<6; i++)
putchar(str1[i]);
putchar('\n');
for(i=0; i<6; i++)
putchar(str2[i]);
putchar('\n');
分别定义了一个数组和指针,都是用来存储字符串,然后分别控制下标来打印字符串。
从打印结果来看,数组和指针定义的字符串都可以正常打印,说明按照数组的操作方法来操作指针也是可以的。 那么能不能用操作指针的方法来操作数组呢?
修改程序如下:
char str1[] = "abcdef";
char *str2 = "123456";
int i;
for(i=0; i<6; i++)
putchar( *(str1 + i) );
putchar('\n');
for(i=0; i<6; i++)
putchar( *(str2 + i) );
putchar('\n');
在输出字符的时候,使用指针加法的操作,通过指针去取对应地址上的值。输出结果如下。
通过数据结果可以看出,把数组当做指针操作也是可以的。在平常使用指针输出字符串的时候,大多数情况下都是使用while循环,通过判断结束符来终止输出。这里将for循环改为while循环试试。
while(*str2 != '\0')
putchar( *str2++ );
通过判断结束符来决定是不是要继续打印,然后只用指针递增的操作来取下一个字符。
接下来将数组也改成这种方式。
此时编译器提示代码出错了。
为什么会出错呢?这里就是数字和指针的区别了。
数组名是常量,指针是变量。常量不能进行自增操作,但是变量可以进行自增操作。
根据这个区别就可以知道对常量可以进行的操作对数组名就可以进行,对常量不能进行的操作,对数组名也不能进行操作。当定义了一个数组之后,这个数组名就不能再改变了,用于指向的是这个数组。但是定义了一个指针之后,这个指针的指向是可以改变的。可以用这个指针指向当前数组,也可以用这个指针指向另一个数组。比如在程序运行的过程中改变指针的指向。
char str1[] = "abcdef";
char *str2 = "123456";
int i;
for(i=0; i<6; i++)
putchar( *(str1 + i) );
putchar('\n');
str2 = str1;
while(*str2 != '\0')
putchar( *str2++ );
putchar('\n');
在打印指针指向的字符串时,改变指针的指向。
从打印的结果可以看出,指针打印出来的字符串内容已经发生了改变。所以在使用指针的时候要注意这个问题。