普通变量和指针变量用字符串赋值时是有区别的。
特别是数组与字符串,数组名本质上是数组的首地址。在对指针/数组(名)用字符串同样如此,赋值时同样为首地址。
对于普通变量,赋值操作实际上是将一个字符串常量中的字符逐个复制到变量所在的内存空间中,
char name[10];
name = "xiaoming"; // 这样赋值是错误的
这种赋值方式是错误的,因为 name 是一个字符数组,而不是字符指针,所以不能将一个字符串常量的地址直接赋值给它。
正确的赋值方式应该是使用字符串函数来将字符串复制到数组中:
char name[10];
strcpy(name, "xiaoming"); // 将 "xiaoming" 复制到 name 中
其等价于
name[10] = "xiaoming"
对于指针变量,赋值操作是将指针指向字符串常量所在的内存地址,例如:
char *name;
name = "xiaoming"; // 将 name 指向 "xiaoming" 字符串常量的首地址
需要注意的是,这里的字符串常量是存储在常量区的,不能修改。如果需要修改字符串内容,可以使用动态内存分配来分配一段可写的内存空间,并将指针指向这段内存空间的首地址。
同样,在结构体中常用:
struct student{
char *name;
int score;
struct student* next;
}stu,*stu1;
这段代码定义了一个名为 student 的结构体,它包含了三个字段:
name:指向一个字符的指针,代表学生的名字
score:一个整数,代表学生的成绩
next:一个指向另一个 student 结构体的指针,代表链表中的下一个学生
此外,还声明了两个变量:
stu:一个 student 结构体类型的变量
stu1:一个指向 student 结构体的指针变量
这里可以看出,stu 是一个结构体类型的变量,而 stu1 则是一个指向结构体的指针类型变量。
在之后结构体赋值时:
int main()
{
stu1.name = "xiaoming";
printf("学生stu1的名字为%s", stu1.name);
return 0;
}
在C语言中,不能在结构体定义之后直接使用大括号初始化,必须在创建结构体变量的时候进行初始化。
如下为错误语法:
struct Student {
int id;
char* name;
int age;
float goal;
}stu1;
int main()
{
stu1 = { 100, "xiaoming", 10, 99.2 };
printf("学生stu1的名字为%s", stu1.name);
return 0;
}
正确语法如下:
typedef struct Student {
int id;
char* name;
int age;
float goal;
}Student;
int main()
{
Student stu1 = { 100, "xiaoming", 10, 99.2 };
printf("学生stu1的名字为%s", stu1.name);
return 0;
}