#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    char str[20] = "c.biancheng.net";

    char *s1 = str;
    char *s2 = str+2;

    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);//str 既是数组名称,也是一个指向字符串的指针;指针可以参加运算,加 1 相当于数组下标加 1。
    printf("  s2 = %s\n", s2);
    //printf() 输出字符串时,要求给出一个起始地址,并从这个地址开始输出,直到遇见字符串结束标志\0。s1 为字符串 str 第 0 个字符的地址,s2 为第 2 个字符的地址,所以 printf() 的结果分别为 c.biancheng.net 和 biancheng.net。
    printf("  c1 = %c\n", c1);//从0开始数,第四个位置,字符是a
    printf("  c2 = %c\n", c2);//输出一个字符,首个字符是c
    printf("  c3 = %c\n", c3);//指针可以参加运算,str+4 表示第 4 个字符的地址,c3 = *(str+4) 表示第4个字符,即 'a'。
    
    printf("  c4 = %c\n", c4);//字符与整数运算时,先转换为整数(字符对应的ASCII码)。num1 与 c4 右边的表达式相同,对于 num1,*str+2 == 'c'+2 == 99+2 == 101,即 num1 的值为 101,对于 c4,101 对应的字符为 ‘e’,所以 c4 的输出值为 'e'。
    printf("  c5 = %c\n", c5);
    //其实,数组元素的访问形式可以看做 address[offset],address 为起始地址,offset 为偏移量:c1 = str[4]表示以地址 str 为起点,向后偏移4个字符,为 'a';c5 = (str+1)[5]表示以地址 str+1 为起点,向后偏移5个字符,等价于str[6],为 'c'。
    printf("num1 = %d\n", num1);//看C4说明
    //num2 和 num3 分别为字符串 str 的首地址和第 2 个元素的地址。
    printf("num2 = %ld\n", num2);
    printf("num3 = %ld\n", num3);
    return 0;
}

标签: none

添加新评论