字符串数组和字符串指针在进行字符串操作时的区别

3 篇文章 0 订阅
我们都知道可以用数组还有指针来接收字符串,两者在存储字符串时还是有细微的差别的。下面来进行一下讨论,有不对的欢迎大家指正。

1、字符指针本身就是一个整型变量,用来存放指向某个字符串的地址,这个字符串是存放在以这个地址为起始的一串的地址空间中,最后一位自动添加 '\0';字符数组是用一个连续的空间来存放数值,最后并不会自动添加 '\0'.

2、字符串指针定义过程:

可以在定义时候直接赋值:

char * a = {"i am a girl"};

也可以在定义之后再次赋值:

char *a;
a = (char *) malloc (sizeof(char) * 100);   
a = "i am a girl";


//一个字符串指针的例子,实现字符串反转

char *a ;
a = (char *) malloc (sizeof(char) * 100);  //定义一个指针,同时必须为它申请空间
scanf("%s", a);
int len = strlen(a);
int i = 0, j = len - 1;
char temp = '\0';
while(i < j)    //本功能块实现两个字符的交换功能,因为是单个字符可以直接交换赋值,如果是字符串必须要使用strcpy()!
{
       temp = a[i];
       a[i++] = a[j];
       a[j--] = temp;
}
printf("%s", a); //此处用a, 而不是*a,具体机制还没有弄明白  (?)



3、字符数组定义过程:

定义时直接赋值

char a[100] = {'I', 'w', 'i', 't', '\0'};

 

不可以定义之后再赋值!

char a[100];
char = {'i','am','a','girl','\0'};   //编译不通过!!


4、几点注意:

定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):

       char *p=”abcdefg”;

       注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

       Float *p=3.14;  /*错误,无法通过编译*/

       需要这样定义,

       float e = 0.13;
       p = &e;

下面谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:

    在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
    数组也可以用字符串常量进行初始化:

       Char a[]=”abcdefg”;

       如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。

在内存机制中的区别:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

 int strlower(char *string)  
 {  
     if(string==NULL)  
    {  
        return -1;  
    }  
  
    while(*string)  
     {  
        if(isupper(*string))  
             *string=tolower(*string);  
       string++;  
     }  
   *string='\0';  
    return 0;  
 }  

 
int main(void)  
 {  
    char test[]="ABCDEFGhijklmN";  //编译通过
    char *test = "abcdfESD"; //编译不通过,不可以在程序中再修改常量
    strlower(test);  
    cout<<test<<endl;  
    system("pause");
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值