关于字符串常量和字符指针

char *p和 char p[]的区别和字符串常量
void main()
{
char *p="abc123ABC";//char p[]="abc123ABC"
p[0]='d';
}
上面这段代码编译链接都没问题,但是运行时错误。
将char *改成char p[]="abc123ABC"就正确了。原因如下:赋值号右端是一个字符串常量,分配在进程的只读常量数据区,然后将只读常量的地址值赋给了指针p,因此p指向了只读数据区,所以对p进行赋值(写入)操作是非法的。
而char p[]是一个数组,代码运行时,首先获得字符串的长度L,然后给数组分配(L+1)的字节内存,将"abc123ABC"加上\0写入到该内存里面,这个内存是可读写,所以赋值操作没问题,程序运行无误。
另外,char* p="abc123ABC"; sizeof(p)的返回值是4,因为一个指针常量所占内存是4个字节(32位操作系统)。而charp[]="abc123ABC"; sizeof(p)的返回值是10,因为p是数组,p的所占字节是字符串长度(字符数目)加1,最后的字节是'\0',表示字符串的结尾。
在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、付费专栏及课程。

余额充值