老犯此类错误!!!
char *p = "abc";则abc存储在常量存储区,而p直接指向了这个常量存储区,所以不能改变abc的内容
*p = 'd'; 是错误的,因为是常量存储区,不能改变。
char *p = NULL;
*p = 'd';
也是错误的。
char *p;
*p='d';
也是错误的,提示指针没有赋初值。
以上几种更不可以strcpy(p,"abc");
总之,上面的指针都相当于const char *p,不能修改*p的内容!但可以修改其指向,如:
char *a = "abc";
p = a;
是可以的。但这样的操作不安全!!因为如果一旦a被回收了,p就跟着完蛋了。尤其是如果在子函数中,局部变量自动回收,这种不安全行为就会突出。
字符数组:
char p[]="abc";//相当于strcpy(p,“abc”),如果定义在全局,abc就在全局区,如果在局部,abc就在栈内。
*p = 'd'; 是正确的,
不过这样的p已经固定了其长度(为3+1=4),p相当于数组p[4],且p[3]=='\0'
printf("%d\n",p[3]);
p[3] = 'b';
printf("%d\n",p[3]);
都是可以的。
但p[4] = 'd'越界
总之,字符数组相当于有限长度的char *const p;
可以修改内容,但不可以修改指向
如果
想要一个可以改变值且不固定长度的字符串,安全的办法就是使用动态分配malloc和realloc
char *a = "abc";
char *p = (char *)malloc(sizeof(char)*strlen(a));
strcpy(p,a);
是正确的。
另外对于字符串或者数组,要时刻注意在后面添加结束符'\0',否则极易出问题,比如
int i;
char a[5];
for(i=0; i<4; i++)a[i]=i+'0';
printf("%s",a);
没有结束符,打印出来是乱码。
安全简单的做法是声明数组时让其元素初始化为{0}
int i;
char a[5] = {0};
for(i=0; i<4; i++)a[i]=i+'0';
printf("%s",a);
当然不能把最后一个结束符都挤掉了,比如下面的也会出问题
int i;
char a[5] = {0};
for(i=0; i<5; i++)a[i]=i+'0';
printf("%s",a);
因为最后的结束符a[4] 被冲掉了。
分享到:
相关推荐
C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ
在C/C++编程语言中,字符数组和字符指针是非常重要的数据类型,尤其是在处理文本数据时。这两种类型的使用非常广泛,但在实际编程过程中,不少开发者往往会在它们之间产生混淆,导致程序出现错误。本文将详细介绍...
字符串指针字符串指针与字符数组的区别与字符数组的区别 转载
在编程世界中,栈字符数组和指针与数组的关系是两个重要的基础知识,它们在实际编程中经常被使用,但同时也容易引发错误。本文将详细探讨这两个主题,旨在帮助你理解和避免相关的问题。 首先,让我们来看看栈字符...
但是,p3 的定义是正确的,而 p4 的定义是错误的,因为 p4 的右边是一个指向单个字符的指针,而左边是指向整个数组的指针。 五、地址的强制转换 在下面的例子中,我们定义了一个结构体 Test: ```c struct Test{ ...
在C语言中,字符数组和字符指针是处理文本数据的两种常见方式。字符数组通常用于存储固定长度的字符串,而字符指针则用于指向字符串的首地址。 #### 二、字符串直接量的特点 1. **字符串直接量与结束符**: - ...
例如,下面是一个两维字符数组的定义: ```c char color1[][6]={"RED","GREEN","BLUE"}; ``` 这个数组的每个元素是一个字符串,而不是指针。相比之下,指针数组的每个元素是一个指针,指向一个字符串。 四、指针...
总结起来,本讲介绍了如何使用指针数组来存储和排序字符串。通过定义一个指针数组,初始化各个元素指向字符串,然后对指针数组进行排序,可以实现字符串的字母顺序输出。这种技巧在处理动态数据集或需要高效排序时...
在C语言中,指针和字符数组都是处理字符串的重要工具,但它们之间存在显著的区别。 1. **字符指针与字符数组的区别** - **存储格式**:字符指针(变量)存储的是字符串的首地址,即一个内存地址(通常为2字节)。...
在C语言中,字符数组和字符指针是处理字符串(以'\0'为结束符的字符序列)的重要工具。本章主要讨论了如何通过指针进行字符串的输入和输出。 首先,字符数组用于存储字符串。例如,定义了一个大小为81(包括一个...
使用字符数组和字符指针时,对字符串操作函数的使用也有一些区别。例如,strcpy、strcat等函数,它们需要传递数组名或者指针变量来操作字符串: ```c strcpy(str, "Another string"); // 字符数组操作 strcat(str, ...
每个元素都是一个指向字符数组(即字符串)的指针。 2. **字符串排序**:字符串排序通常是指按照字典顺序对字符串进行排序,可以是升序或降序。在计算机科学中,排序算法是基础而关键的一部分,它影响着数据处理的...
字符串可以使用字符数组或字符指针来表示。 #### 字符数组表示法 ```c char str[6] = "hello"; ``` 这里 `str` 是一个长度为6的字符数组,最后一个元素是结束符`\0`。 #### 字符指针表示法 ```c char *ptr = ...
本篇文章将深入探讨易语言中如何使用指针来操作字符串和数组,以及如何通过指针数组进行参数传递。 1. **指针基础**: - 在易语言中,指针是一个变量,存储的是其他变量的内存地址。指针变量需要先声明,然后通过`...
// 字符指针数组,数组里面有5个元素,每个元素是char*类型 ``` 指针数组的用法有很多,例如可以将一些变量的地址存放进一个数组里面。例如: ```c int a = 10; int b = 20; int c = 30; int d = 40; int* arr[4] =...
二维数组在C++中本质上是一级指针的数组,每个元素又是一个一级指针,指向一维字符数组。因此,二级指针可以用来直接访问和修改这些一维数组的内容。下面将详细解释这个过程: 1. **二级指针的声明**: 在C++中,...
本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。
注意,由于是宽字符数组,我们应使用`LPCWSTR`(常量宽字符指针)来处理每个字符串: ```cpp void ProcessStrings(int count, wchar_t** strings) { for (int i = 0; i ; i++) { wprintf(L"%ls\n", strings[i]);...
本章主要讨论了如何使用指针数组来存储和操作多个字符串,以及这种存储方式相对于二维字符数组的优势。 首先,我们来看一个常见的问题:如何有效地存储一组字符串?一种方式是使用二维字符数组,如`char country[]...