C语言中编译器会给字符串常量分配地址,如果 "China", 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005 .
s = "China" ,意识是什么,对了,地址。
其实真正的意义是 s ="China" = 0x3000;
所以printf("%s",str); 本质也是 printf("%s", 地址");
当定义 char a[10 ] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。。
而定义 char *s 时, 这是个指针变量,只占四个字节,32位,用来保存一个地址。。
sizeof(a) = 10 ;
sizeof(s) = 4
printf("%p",s);
这个表示 s 的单元中所保存的地址。。
printf("%p",&s);
这个表示变量本身所在内存单元地址。
先看 char *a [ ] ;
由于[ ] 的优先级高于* 所以a先和 [ ]结合,他还是一个数组,数组中的元素才是char * ,前面讲到char * 是一个变量,保存的地址。
所以 char *a[ ] = {"China","French","America","German"};
同过这句可以看到, 数组中的元素是字符串,那么sizeof(a) 是多少呢,有人会想到是五个单词的占内存中的全部字节数 6+7+8+7 = 28;
但是其实sizeof(a) = 16;
。
二级指针的简单用法。。。。,说白了,二级指针保存的是一级指针的地址,它的类型是指针变量,而一级指针保存的是指向数据所在的内存单元的地址,虽然都是地址,但是类型是不一样的。。。
#include <stdio.h>
void buf( char **s)
{
*s = "message";
}
int main()
{
char *s ;
buf(&s);
printf("%s\n",s);
}
char **s = "hello world";
这样是错误的,
因为 s 的类型是 char ** 而 "hello world "的类型是 char *
虽然都是地址, 但是指向的类型不一样,因此,不能这样用。,从其本质来分析,"hello world",代表一个地址,比如0x003001,这个地址中的内容是 'h'
,为 char 型,而 s 也保存一个地址 ,这个地址中的内容(*s) 是char * ,是一个指针类型, 所以两者类型是不一样的。 。。
如果是这样呢?
转载的