您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

C语言数组灵活多变的访问形式

时间:12-26来源:作者:点击数:
C语言中的指针使得代码的编写非常灵活,如果指针能够和数组结合,那将会有更多的“花招”,请看下面的代码:
#include <stdio.h>
int main(){
    char str[20] = "www.cdsy.xyz";
   
    char *s1 = str;
    char *s2 = str+4;
   
    char c1 = str[4];
    char c2 = *str;
    char c3 = *(str+4);
    char c4 = *str+2;
    char c5 = (str+1)[5];
   
    int num1 = *str+2;
    long num2 = (long)str;
    long num3 = (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);
    return 0;
}

运行结果:

  s1 = www.cdsy.xyz
  s2 = cdsy.xyz
  c1 = c
  c2 = w
  c3 = c
  c4 = y
  c5 = s
num1 = 121
num2 = 9435328
num3 = 9435330

怎么样,够晕吧,如果你嗤之以鼻,那么恭喜你,你的C语言基础很扎实。

1) str 既是数组名称,也是一个指向字符串的指针;指针可以参加运算,加 1 相当于数组下标加 1。

printf() 输出字符串时,要求给出一个起始地址,并从这个地址开始输出,直到遇见字符串结束标志\0。s1 为字符串 str 第 0 个字符的地址,s2 为第 4 个字符的地址,所以 printf() 的结果分别为 www.cdsy.xyz 和 cdsy.xyz。

2) 指针可以参加运算,str+4 表示第 4 个字符的地址,c3 = *(str+4) 表示第4个字符,即 'c'。

3) 其实,数组元素的访问形式可以看做 address[offset],address 为起始地址,offset 为偏移量:c1 = str[4]表示以地址 str 为起点,向后偏移4个字符,为 'c';c5 = (str+1)[5]表示以地址 str+1 为起点,向后偏移5个字符,等价于str[6],为 's'。

4) 字符与整数运算时,先转换为整数(字符对应的ASCII码)。num1 与 c4 右边的表达式相同,对于 num1,*str+2 == 'w'+2 == 119+2 == 121,即 num1 的值为 121,对于 c4,121 对应的字符为 ‘y’,所以 c4 的输出值为 'y'。

5) num2 和 num3 分别为字符串 str 的首地址和第 2 个元素的地址。

为了加深大家的理解,请继续阅读下面的代码:

#include <stdio.h>
#include <stdlib.h>
int main(){
    char str[20] = {0};
    int i;
    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]);
   
    return 0;
}

运行结果:

abcdefghij
cdefghij
c
e

第5行代码用来将字符数组中的所有元素都初始化为\0,这样在循环结束时就无需添加字符串结束标志。

前面三个 printf() 比较容易理解,第四个 printf() 可以参照上面的说明 3),str+2 表示指向第 2 个元素,(str+2)[2] 相当于 *(str+2+2),也就是取得第 4 个元素的值。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门