#include <stdio.h>
int main()
{
char str[]={'a','k','m'};
//char str[]="akm";//也是一样
str[4]='p';
//*(str+4)='p';//也是一样
char *s=0;
s=str;
for(int i=0;i<5;i++){
printf("s=%p \n",s);
printf("*s=%c \n",*s);
s++;
}
}
输出结果:
s=0x7ffd8a263869
*s=a
s=0x7ffd8a26386a
*s=k
s=0x7ffd8a26386b
*s=m
s=0x7ffd8a26386c
*s=
s=0x7ffd8a26386d
*s=p
c语言的数组是一段连续的内存地址,如果是char数组,每个元素占用一位内存,所以可以用str[]中的str直接指向第一个元素的地址。在定义数组的时候,以0或者null结束,也就是说,在遍历数组的时候,遇到null时,认为数组已经结束。利用字符串定义数组的时候,系统会自动增加一个字符null,也就是说str[]=“akm”,实际上是有’a’, ‘k’, ‘m’, null,共四个元素。当按照指针值直接给第5个位赋值之后,直接用str[4]可以访问,但是因为str[3]是null,所以遍历数组的时候,到str[3]就结束了。
在Xcode中,用str[4]访问,会报错,认为超出数组下标,也就是说,Xcode会在添加元素的时候检查是否越界。
如果指针定义的是char *p,那么每次p++实际上是p=p+1,因为每个char占用1位。
如果指针定义的是int *p,那么每次p++实际上是p=p+4,因为每个int占用4位。