C语言 char*和char[]用法

本文详细介绍了C语言中char数组与char指针的区别。char[]定义的是字符数组,可以修改元素;char*定义的是字符串指针,指向不可修改的常量字符区。通过实例展示了sizeof运算符在两者间的不同结果,以及如何通过指针操作数组。强调了在使用指针时要注意内存权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • char []定义的是一个字符数组,注意强调是数组。
  • char * 定义的是一个字符串指针,注意强调是指针。


char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:

当char *s = “hello”;后,不能使用s[0]=‘a’;语句进行赋值。这是将提示内存不能为"written"。

当用char s[]=“hello”;后,完全可以使用s[0]=‘a’;进行赋值,这是常规的数组操作。
若定义:

char s[] = "hello";
char *p = s;


也可以使用p[0] = ‘a’;因为这是p ==s,都是指向数组的指针。

char *s = (char *)malloc(n);//其中n为要开辟空间的大小


相当于

char s[n];

#include <stdio.h>
int main(int argc, char* argv[]) {
	char* buf1 = "abcd1234";
	char buf2[] = "abcd1234";
	printf("size of buf1: %d\n", sizeof(buf1));
	printf("size of buf2: %d\n", sizeof(buf2));
	printf("长度为:%d  %d\n", strlen(buf1), strlen(buf2));
return 0;

size of buf1: 4
size of buf2: 9
长度为:8 8

<think>嗯,用户问的是C语言char指针字符数组的区别,还有它们的用法、使用场景以及示例代码。我需要仔细整理一下这些概念,确保自己理解正确,然后再用简单易懂的中文解释清楚。 首先,根据引用里的内容,字符指针(char *字符数组(char [])在C语言中确实容易混淆。我记得字符指针是一个变量,可以指向不同的字符串,但指向的内容可能不可变,特别是如果指向的是字符串常量的话。而字符数组是分配在栈上的,数组名本身是常量指针,不能改变指向,但可以修改数组内的内容。例如,像引用[4]提到的,字符指针可以改变指向,而字符数组不能改变地址,但可以修改内容。 然后,关于它们的存储位置。字符数组在声明时会在栈上分配固定大小的内存,比如char str[10]就会分配10个字节。而字符指针通常指向常量区或者动态分配的内存,比如用malloc。引用[3][4]都提到了这一点,需要注意指针指向的内容是否可修改,比如指向字符串常量的话,修改会导致错误。 接下来是初始化方式。字符数组可以在声明时用字符串字面量初始化,比如char arr[] = "hello";,这时候数组的大小会自动计算。而字符指针可以直接赋值,比如char *p = "hello";,这时候p指向的是常量区的字符串,不能修改。不过如果指针指向的是数组或者动态内存,就可以修改,这部分可能需要进一步说明。 然后是内存管理。字符数组不需要手动释放,作用域结束自动回收。而如果指针指向的是动态分配的内存,就需要用free来释放,否则会内存泄漏。引用[5]提到的指针数组的例子,可能动态分配有关,但用户的问题可能更关注单个指针数组的区别。 使用场景方面,字符数组适合存储固定大小的字符串,需要频繁修改内容的情况。而字符指针适合需要动态分配内存,或者指向不同字符串的情况。比如函数参数传递时,使用指针更灵活,或者处理字符串常量的时候用指针更合适。 示例代码部分,需要展示两者的不同用法,比如修改内容时的错误情况,比如指针指向常量字符串时试图修改会导致崩溃,而数组可以修改。还要展示指针可以重新指向其他字符串,而数组不能重新赋值。 可能用户在实际编程中容易混淆两者的区别,导致运行时错误,比如试图修改指针指向的常量字符串,或者数组越界。需要指出这些常见错误,并给出正确的用法。 另外,引用[1][2]提到的指针类型差异,比如&arr的类型是数组指针,这可能涉及到指针运算的不同,但用户的问题可能更关注基本区别,所以这部分可能不需要深入,除非用户问到。 总结下来,我需要分点列出区别,包括定义、存储位置、初始化、内存管理、使用场景,并给出示例代码说明何时会导致错误,以及正确的做法。同时,回答要结构清晰,用中文自然表达,避免术语堆砌,让用户容易理解。</think>### C语言char指针与字符数组的区别及用法解析 #### 一、核心区别 1. **定义与本质** - **字符指针(`char*`)**:是一个指针变量,存储字符串的地址,可指向不同内存位置的字符串[^4]。 - **字符数组(`char[]`)**:是连续内存空间,数组名是常量指针,地址不可变,但内容可修改。 2. **内存分配与生命周期** - **字符指针**: - 若指向字符串字面量(如`char* p = "hello"`),字符串存储在常量区,不可修改[^4]。 - 若指向动态内存(如`malloc`分配),需手动释放,否则内存泄漏[^3]。 - **字符数组**: - 栈上分配固定空间(如`char arr[10]`),作用域结束自动释放。 3. **初始化与赋值** - **字符数组**: ```c char arr[] = "hello"; // 合法,自动计算大小 arr[0] = 'H'; // 合法,可修改内容 ``` - **字符指针**: ```c char* p = "hello"; // 合法,但指向常量区 p[0] = 'H'; // 非法,导致段错误 p = "world"; // 合法,可指向新字符串 ``` #### 二、使用场景 1. **字符数组适用场景** - 存储固定长度的字符串,需频繁修改内容(如缓冲区操作)。 - 函数参数传递时需保留原始副本(如`strcpy(arr, "data")`)。 2. **字符指针适用场景** - 动态分配内存处理变长字符串(如`char* p = malloc(100)`)。 - 需要指向不同字符串或作为函数返回值(如返回动态生成的字符串)。 - 作为指针数组元素(如`char* arr[] = {"A", "B"}`)[^5]。 #### 三、示例代码 1. **字符数组的正确操作** ```c char arr[] = "Hello"; arr[0] = 'h'; // 合法,输出"hello" ``` 2. **字符指针的错误操作** ```c char* p = "Hello"; p[0] = 'h'; // 非法,运行时崩溃(常量区不可修改) ``` 3. **动态内存的正确用法** ```c char* p = malloc(6); strcpy(p, "Hello"); p[0] = 'h'; // 合法,输出"hello" free(p); // 必须手动释放 ``` #### 四、常见问题 1. **为何字符指针赋值字符串字面量后不可修改?** 字符串字面量存储在只读内存段,修改会触发访问冲突。 2. **字符数组名能否重新赋值?** 不能,数组名是常量指针(如`arr = "new"`非法)[^4]。 3. **指针数组与二维数组的区别?** 指针数组(如`char* arr[]`)元素指向不同内存块,二维数组(如`char arr[][10]`)是连续内存块[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值