指针pointer和char*[]的学习

参考博客:
深入 char * ,char ** ,char a[ ] ,char *a[] 内核:很重要
MIT/JOS/lab1/load the kernel中的pointer.c

  1. 不论指向的数据类型为那种,指针变量其本身永远为整型,因为它保存的地址。
  2. 字符数组:字面意思是数组,数组中的元素是字符。。确实,这就是它的本质意义。
  3. 由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的,这就足够了。
  4. C语言中规定数组名代表数组所在内存位置的首地址,也是 str[0]的地址,即str = &str[0];
  5. 而printf("%s",str); 为什么用首地址就可以输出字符串。。
    因为还有一个关键,在C语言中字符串常量的本质表示其实是一个地址,这是许多初学者比较难理解的问题。。。
    举例:
    char s ;
    s = “China”;
    为什么可以把一个字符串赋给一个指针变量。。
    这不是类型不一致吗???
    这就是上面提到的关键 。。
    C语言中编译器会给字符串常量分配地址,如果 “China”, 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 .
    s = “China” ,意识是什么,对了,地址。
    其实真正的意义是 s =“China” = 0x3000;
    ***看清楚了吧 ,你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址。
    **。
    s = 0x3000
    这样写似乎更符合直观的意思。。。
    搞清楚这个问题。。
    那么 %s ,它的原理其实也是通过字符串首地址输出字符串,printf("%s ", s); 传给它的其实是s所保存的字符串的地址。。。
  6. C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,这是字符串的终极本质。。。
  7. char *s;
    char a[ ] ;
    前面说到 a代表字符串的首地址,而s 这个指针也保存字符串的地址(其实首地址),即第一个字符的地址,这个地址单元中的数据是一个字符,
    这也与 s 所指向的 char 一致。
    因此可以 s = a;
    但是不能 a = s;
    C语言中数组名可以复制给指针表示地址, 但是却不能赋给给数组名,它是一个常量类型,所以不能修改。。
    char a [ ] = "hello"; char *s =a; for(int i= 0; i < strlen(a) ; i++) printf("%c", s[i]); 或 printf("%c",*s++);

8.字符指针可以用 间接操作符 *取其内容,也可以用数组的下标形式 [ ],数组名也可以用 *操作,因为它本身表示一个地址 。。比如 printf("%c",*a); 将会打印出 ‘h’
9.

上一篇:Error fetching https://gems.ruby-china.org/: bad response Not Found 404 (https://gems.ruby-china.or


下一篇:绘图工具——绘制地图