详解C语言数组灵活多变的访问形式
C语言中的指针使得代码的编写非常灵活,如果指针能够和数组结合,那将会有更多的“花招”,请看下面的代码:
#includeintmain(){ charstr[20]="c.biancheng.net"; char*s1=str; char*s2=str+2; charc1=str[4]; charc2=*str; charc3=*(str+4); charc4=*str+2; charc5=(str+1)[5]; intnum1=*str+2; longnum2=(long)str; longnum3=(long)(str+2); printf("s1=%s\n",s1); printf("s2=%s\n",s2); printf("c1=%c\n",c1); printf("c2=%c\n",c2); printf("c3=%c\n",c3); printf("c4=%c\n",c4); printf("c5=%c\n",c5); printf("num1=%d\n",num1); printf("num2=%ld\n",num2); printf("num3=%ld\n",num3); return0; }
运行结果:
s1=c.biancheng.net
s2=biancheng.net
c1=a
c2=c
c3=a
c4=e
c5=c
num1=101
num2=6421984
num3=6421986
怎么样,够晕吧,如果你嗤之以鼻,那么恭喜你,你的C语言基础很扎实。
1)str既是数组名称,也是一个指向字符串的指针;指针可以参加运算,加1相当于数组下标加1。
printf()输出字符串时,要求给出一个起始地址,并从这个地址开始输出,直到遇见字符串结束标志\0。s1为字符串str第0个字符的地址,s2为第2个字符的地址,所以printf()的结果分别为c.biancheng.net和biancheng.net。
2)指针可以参加运算,str+4表示第4个字符的地址,c3=*(str+4)表示第4个字符,即'a'。
3)其实,数组元素的访问形式可以看做address[offset],address为起始地址,offset为偏移量:c1=str[4]表示以地址str为起点,向后偏移4个字符,为'a';c5=(str+1)[5]表示以地址str+1为起点,向后偏移5个字符,等价于str[6],为'c'。
4)字符与整数运算时,先转换为整数(字符对应的ASCII码)。num1与c4右边的表达式相同,对于num1,*str+2=='c'+2==99+2==101,即num1的值为101,对于c4,101对应的字符为‘e',所以c4的输出值为'e'。
5)num2和num3分别为字符串str的首地址和第2个元素的地址。
为了加深大家的理解,请继续阅读下面的代码:
#include#include intmain(){ charstr[20]={0}; inti; for(i=0;i<10;i++){ *(str+i)=97+i;//97为字符a的ASCII码值 } printf("%s\n",str); printf("%s\n",str+2); printf("%c\n",str[2]); printf("%c\n",(str+2)[2]); return0; }
运行结果:
abcdefghij
cdefghij
c
e
第5行代码用来将字符数组中的所有元素都初始化为\0,这样在循环结束时就无需添加字符串结束标志。
前面三个printf()比较容易理解,第四个printf()可以参照上面的说明3),str+2表示指向第2个元素,(str+2)[2]相当于*(str+2+2),也就是取得第4个元素的值。
到此这篇关于详解C语言数组灵活多变的访问形式的文章就介绍到这了,更多相关C语言数组访问形式内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!