其主要赋值的区别在于实际的内存地址空间区别
1.字符型数组给指针赋值
//指针定义并初始化
char str[] = "hello";
char *p = str; //对于数组,指针定义并初始化时不需要&
//先定义后初始化
char str[] = "hello";
char *p;
p = str; //注意别写&str
//原因:因为&str做右值时表示整个数组的首地址
对str进行&,即取出str所在的地址,而str已经代表了数组的首地址,因此再取地址无意义
左值与右值,就是赋值符号(=)的左边的值与右边的值
右值,即一个特定的值。 左值,即可以被赋值的值,理解为程序中占用内存一块空间。
2.普通数组给指针赋值
//指针定义并初始化
char a = 65;
char *p = &a; //对于普通变量,指针定义并初始化时需要&
//先定义后初始化
char a = 65;
char *p;
p = &a;
用字符串数组名给指针变量赋值时,不需要在数组名str前加取地址符& ,因为str已经表示数组首元素首地址,
用普通数的变量名给指针赋值时,需要在普通变量名a前加取地址符&,因为&a表示与变量名a绑定的内存空间的首地址
记住,普通变量赋值给指针时,可以加&,而数组赋值给指针的时候不用加&,因为数组名字本身就已经是首地址常量了
3.字符串常量的例子
当有一个指针
char *p1 = "Hello World";
这里指针指向的是一个空间,这个空间内存放的这一整个字符串,这个字符串是一个字符串常量
再有一个char *p2 = "Hello World";
这个p2与p1指针所在的地址不一样,但是指向的地址都是一样的,都是指向"Hello World"这一个字符串常量的地址
此时,这个字符串常量是放在程序的静态区的(全局变量,static修饰的,字符串常量放在程序的静态区),指针p1,p2是变量是放在栈区的