指针字符串修改问题、static

/在论坛看见这种问题的帖子,看见有人说的很好就把它搬过来了/

char *m = "hello";//相当于const char *m="hello";

"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!

  static作用:1.用于隐藏变量,即别的.c文件不能访问 2.定义为static的变量不会释放,下次调用的时候还会接着上次保留的值继续使用

在C语言中,指针定义字符串常量及引用有多种方式,下面详细介绍相关方法和知识。 ### 字符指针与常量字符串 可以使用字符指针来指向一个字符串常量。字符串常量是用双引号括起来的一串字符,存储在内存的只读区域。例如: ```c #include <stdio.h> int main() { char* str = "Hello, World!"; printf("%s\n", str); return 0; } ``` 这里`"Hello, World!"`是一个字符串常量,`str`是一个字符指针,它指向这个字符串常量的首地址。需要注意的是,不能通过指针修改字符串常量的内容,因为它存储在只读区域。如果尝试修改,会导致未定义行为。 ### 指向常量的指针字符串常量 可以使用指向常量的指针来指向字符串常量,这样可以明确表示不能通过该指针修改字符串内容。指向常量的指针语法为:`const 指针类型 * 指针名称 = 地址;` 或 `指针类型 const * 指针名称 = 地址;` 。示例如下: ```c #include <stdio.h> int main() { const char* str = "Hello, World!"; // 尝试修改字符串内容会报错 // *str = 'h'; printf("%s\n", str); return 0; } ``` 这种写法从认知上告诉指针,它所指向的目标位置的值是常量,不能修改它。虽然目标位置的值实际上不一定是真正的常量,但使用这种指针可以避免误修改操作 [^2]。 ### 字符指针与字符变量 字符指针也可以指向字符变量,通过指针可以访问和修改字符变量的值。示例如下: ```c #include <stdio.h> int main() { char ch = 'w'; char* pch = &ch; printf("%c\n", *pch); *pch = 'm'; printf("%c\n", *pch); return 0; } ``` 在这个例子中,`pch`是一个字符指针,它指向字符变量`ch`的地址。通过`*pch`可以解引用找到`ch`,并进行打印和修改操作 [^1]。 ### 不同存储位置的字符串指针示例 下面是一个字符字面量、数组和指针的调用例子,展示了不同存储位置的字符串指针的定义和使用: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> char* globalHeader = "Chapter"; char globalArrayHeader[] = "Chapter"; void displayHeader() { static char* staticHeader = "Chapter"; char* localHeader = "Chapter"; static char staticArrayHeader[] = "Chapter"; char localArrayHeader[] = "Chapter"; char* heapHeader = (char*)malloc(strlen("Chapter") + 1); strcpy(heapHeader, "Chapter"); // 使用完后释放堆内存 free(heapHeader); } int main() { displayHeader(); return 0; } ``` 在这个例子中,`globalHeader`、`staticHeader`和`localHeader`都是字符指针,指向字符串常量;`globalArrayHeader`、`staticArrayHeader`和`localArrayHeader`是字符数组,存储字符串的副本;`heapHeader`是在堆上动态分配内存存储字符串 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值