C语言字符串指针,指向字符串的指针,字符串结束标志

本文探讨了C语言中字符数组与字符指针的区别,强调了内存存储区域的差异及其对字符串操作的影响。文章还详细阐述了scanf()、puts()、gets()和printf()的功能与使用差异,特别是它们在处理字符串时对空格和结束标志的处理方式。重点讲解了C语言中的字符串结束标志'',它是如何标记字符串结尾并影响字符串处理的。
摘要由CSDN通过智能技术生成

画红色重点——字符数组和字符指针的根本区别:

它们最根本的区别是在内存中的存储区域不一样 !

字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限 ! 而常量区的字符串(也包括其他数据)只有读取权限 ! 没有写入权限。

因为 常量区没有写入权限,所以 当使用 strtok 函数处理 指针字符串时,

char * str = "123s 123s 13s3";
strtok(str,s);

这样就必然会出错。

最后,关于 scanf() puts() gets() printf() 的区别

转载请注明出处

一、scanf()和gets()

1.scanf()

所在头文件:stdio.h

语法:scanf(“格式控制字符串”,变量地址列表);

接受字符串时:scanf(“%s”,字符数组名或指针);

2.gets()

所在头文件:stdio.h

语法:gets(字符数组名或指针);

两者在接受字符串时:

1.不同点:

scanf 不能接受空格、制表符Tab、回车等;

而gets 能够接受空格、制表符Tab和回车等;

scanf :当遇到回车,空格和 tab键 会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。

gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

#include
<think>嗯,用户想了解C语言字符串指针指向常量还是变量,以及它们之间的区别。让我先回忆一下相关的知识点。根据引用[1]中的例子,字符指针可以指向一个字符变量,这时候指针是可以解引用并修改值的。比如char* pch = &ch;,然后通过*pch = 'm'改变了ch的值。这说明当指针指向变量时,字符串内容是可以修改的。 然后,引用[3]和引用[4]提到,当字符指针指向常量字符串时,比如char* str = "Hello";,这时候字符串是存储在只读内存区域的,不能通过指针修改内容。如果尝试修改,会导致未定义行为,比如程序崩溃。这是因为C/C++会把常量字符串放在单独的内存区域,多个指针指向同一个常量字符串时,它们实际指向同一块内存,这样可以节省空间。 还有,引用[4]指出,如果用相同的常量字符串初始化不同的数组,比如char str1[] = "hello";和char str2[] = "hello";,这两个数组会开辟不同的内存块,所以str1和str2的地址不同。而用指针的话,比如char* str3 = "hello";和char* str4 = "hello";,str3和str4会指向同一块内存,因为它们都是指向常量字符串。 用户可能混淆了指针指向的是常量还是变量的情况。需要区分指针本身的类型和指向的内容是否可修改。比如,char* ptr指向的如果是数组,那内容可以修改;如果是常量字符串,则不能修改。另外,指针变量本身是变量,可以指向不同的地址,但指向的内容是否可修改取决于存储的区域。 可能还需要解释为什么用指针和数组初始化会有不同的行为。比如,数组会复制字符串到自己的内存空间,而指针只是指向已有的常量字符串。因此,当修改数组内容时是允许的,但通过指针修改常量字符串则不行。 总结一下,回答需要涵盖以下几点: 1. 字符指针可以指向变量或常量字符串。 2. 指向变量时,可修改内容;指向常量字符串时不可修改。 3. 指针变量本身是变量,可以改变指向。 4. 常量字符串在内存中的存储特性,多个指针可能指向同一地址。 5. 数组初始化字符串指针的不同行为。 可能还需要给出示例代码,说明不同的情况,比如修改指针指向变量和常量时的不同结果,以及数组的情况。同时,注意引用中的例子,比如引用[4]中的str1、str2与str3、str4的区别。 用户的问题可能还涉及如何安全地使用字符串指针,避免未定义行为。因此,在回答中可以建议使用const关键字来声明指向常量的指针,以防止意外修改,比如const char* ptr = "Hello";,这样编译器会阻止修改操作。 最后,生成相关问题时要围绕字符串指针、常量、变量的区别,比如如何安全使用、内存管理、常见错误等。</think>### C语言字符串指针指向常量或变量的区别 在C语言中,字符串指针可以指向**常量字符串**或**变量字符串**,其行为和内存管理方式有显著差异。以下是关键区别: --- #### 1. **指向常量字符串指针** - **定义方式**:`char *ptr = "Hello";` - **特点**: - 字符串`"Hello"`存储在**只读内存区域**(常量区),内容不可修改。 - 多个指针指向同一常量字符串时,实际指向同一内存地址以节省空间[^4]。 - 尝试通过指针修改内容会导致**未定义行为**(如程序崩溃)[^3]。 - **示例**: ```c char *str1 = "Hello"; char *str2 = "Hello"; // str1和str2指向同一地址 printf("%p %p\n", str1, str2); // 输出相同地址 // *str1 = 'h'; // 错误:尝试修改常量字符串 ``` --- #### 2. **指向变量字符串指针** - **定义方式**:通过字符数组初始化,如 `char arr[] = "Hello";`,再用指针指向数组首地址。 - **特点**: - 字符串存储在**栈或堆内存**中,内容可修改。 - 每个字符数组会独立开辟内存空间,即使内容相同,地址也不同[^4]。 - **示例**: ```c char arr1[] = "Hello"; char arr2[] = "Hello"; char *ptr1 = arr1; char *ptr2 = arr2; printf("%p %p\n", ptr1, ptr2); // 输出不同地址 *ptr1 = 'h'; // 合法:修改变量字符串 ``` --- #### 3. **指针变量本身的特性** - 指针变量是**可变的**,可以重新指向其他地址: ```c char *ptr = "Hello"; ptr = "World"; // 合法:指针指向新的常量字符串 ``` - 若需明确指针指向常量,可用`const`修饰: ```c const char *ptr = "Hello"; // 防止误修改 ``` --- #### 4. **关键区别总结** | 特性 | 指向常量字符串 | 指向变量字符串 | |---------------------|------------------------------|-------------------------------| | **存储区域** | 只读内存区 | 栈或堆内存 | | **内容是否可修改** | 不可修改 | 可修改 | | **相同字符串的地址**| 多个指针指向同一地址 | 不同数组指向不同地址 | | **语法示例** | `char *ptr = "Hello";` | `char arr[] = "Hello";` | --- #### 5. **常见错误** - **错误修改常量字符串**: ```c char *ptr = "Hello"; *ptr = 'h'; // 运行时错误(如Segmentation Fault) ``` - **错误初始化指针**: ```c char *ptr; strcpy(ptr, "Hello"); // 错误:ptr未分配内存 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值