字符串赋值指针变量与普通变量的区别

文章讲述了在C语言中,普通变量和指针变量在对字符串赋值时的不同处理方式。普通变量需要使用字符串函数如strcpy来复制字符串,而指针变量可以直接赋值为字符串常量的地址。同时,文中也提到了在结构体中使用指针变量存储字符串的情况,并强调了在C语言中结构体的初始化规则。
摘要由CSDN通过智能技术生成

普通变量和指针变量用字符串赋值时是有区别的。

特别是数组与字符串,数组名本质上是数组的首地址。在对指针/数组(名)用字符串同样如此,赋值时同样为首地址。

对于普通变量,赋值操作实际上是将一个字符串常量中的字符逐个复制到变量所在的内存空间中,

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值