const char *p = "Hello world";//表明该字符串内容不可修改
char * const p;//操作硬件时用到,例如操作lcd的缓存,指向的位置不可变,但位置中的像素的数据在不断刷新,用来显示不同颜色
const char * const p;//常用来描述rom
volatile主要用来修饰指针,防止被优化。例如:volatile char *p
int *p;p+1的值是p+sizeof(int);和char *p;p+1的值不同,是p+sizeof(char)
指针不是同类型的比较没有意义,例如:int *p和char *p的值的大小比较没有意义
数组名是常量,int a[100],数组名不会放到等号左边,即a=xxx
char buf[100];
buf = "Hello World";//这行代码是有问题的,buf是常量
a[-100]也是可以的,只是偏移方向不同
int a[100] = {};//cpu本身不支持空间拷贝空间的运算,例如这行代码,但编译器会把这行代码编译为a[0] = xxx;a[1] = xxx;...
char buf[10] = "abc";内存中有两份abc,一份在常量区,一份在栈中
char buf[] = "abc";buf的长度为4,注意末尾有‘\0’
char buf[10] = "abc";
buf = "hello world";//该行错误,buf是常量标签,不能再次赋值
如果想对buf再次赋值,只能逐一赋值,即buf[0] = 'h',buf[1]='e'...buf[n+1] = 0
字符拷贝函数的原则就是上面的逐一拷贝,一遇到0,拷贝就结束
strcpy(buf,"Hello World");//带str的函数会把字符串末尾的‘\0’一同拷贝过去
strcpy拷贝的时候,如果源字符串的长度很大,目的字符数组长度不大,就会拷贝满,并且把字符数组挨着的内存也拷贝成数据,如果此时挨着的内存有重要数据,就会覆盖。这样就导致内存泄漏,所以strcpy在工程中严禁使用。此时就要使用strncpy