您的位置 首页 > 数码极客

指针结构体如何用scanf赋值、scanf不能对指针赋值吗

字符串与指针

1、字符串的表示形式:

数组形式:

  • char string[] = “hello world"; //栈(局部)

字符指针形式:

  • char *str = “hello world"; //文字常量区

数组形式与字符指针形式都是字符串的表示形式,但是这两种表示形式大不相同。

下面以数字形式字符串char string[] = “hello world"; 与指针形式字符串char *str = "hello world";为例:

  • 1、储存方式:
  • (1)字符数组由若干元素组成,每个元素存放一个字符,
  • (2)而字符指针变量只存放字符串的首地址,不是整个字符串。
  • 2、存储位置:
  • (1)数组是在内存中开辟了一段空间存放字符串;
  • (2)而字符指针是在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给指针变量str。
  • 3、赋值方式:

对与数组,下面的赋值方式是错误的:

  • char str[10];
  • str="hello";

而对字符指针变量,可以采用下面方法赋值:

  • char *a;
  • a="hello";
  • 4、可否被修改:
  • (1)指针变量指向的字符串内容不能被修改,但指针变量的值(即存放的地址或者指向)是可以被修改的;

例一:指针变量指向的字符串内容不能被修改

  • char *p = "hello"; //字符指针指向字符串常量
  • *p = 'a'; //错误,常量不能被修改,即指针变量指向的字符串内容不能被修改
  • 说明:定义一个字符指针指向字符串常量“hello”,修改指针变量指向的字符串的内容,即*p = 'a',发生错误,指针变量指向字符串常量,
  • 而常量字符串存在文字常量区,这段空间中的内容为只读内容,不能被修改,即指针变量指向的字符串内容不能被修改。

例二:指针变量的值可以被修改

  • char *p = "hello"; //字符指针指向字符串常量
  • char ch = 'a';
  • p = &ch; //指针变量指向可以改变
  • 说明:定义一个字符指针指向字符串常量“hello”,同时定义一个字符变量ch,改变指针变量的指向,即让p指向字符变量ch,这样是可以的,即指针变量的指向是可以改变的。
  • (2)字符串数组内容可以被修改,但字符串数组名所代表的字符串首地址不能被修改
  • 例子:定义了一个数组buf,编译器在编译时为它分配内存单元,有确定的地址,此例子中为0X0034FDCC,给buf赋不同的值,字符串数组数组名所代表的字符串首地址没有改变,一直为0X0034FDCC。

  • 5、初始化:
  • 定义了一个数组,在编译时为他分配内存单元,他有确定的地址;而在定义一个字符指针变量时,最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序,以下方式是允许的:
  • char str[10];
  • scanf("%s", str); //或使用字符串拷贝函数进行拷贝赋值
  • 以下方式不推荐,是很危险的:
  • char *p; //指针变量未初始化,指向一个不确定的内存段
  • scanf("%s", p);
  • 以下方式是推荐使用的:
  • char *p = NULL;
  • p = (char *)malloc(10);
  • scanf("%s", p); //或使用字符串拷贝函数进行拷贝赋值

指针与字符串就简单介绍这么多,后续写写函数与指针相关内容,想了解的小伙伴可以关注。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“指针结构体如何用scanf赋值,scanf不能对指针赋值吗,如何用scanf给结构体赋值,c语言结构体scanf赋值,c语言结构体数组scanf赋值,用scan”边界阅读