我们都知道可以用数组还有指针来接收字符串,两者在存储字符串时还是有细微的差别的。下面来进行一下讨论,有不对的欢迎大家指正。
1、字符指针本身就是一个整型变量,用来存放指向某个字符串的地址,这个字符串是存放在以这个地址为起始的一串的地址空间中,最后一位自动添加 '\0';字符数组是用一个连续的空间来存放数值,最后并不会自动添加 '\0'.
2、字符串指针定义过程:
可以在定义时候直接赋值:
也可以在定义之后再次赋值:
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”;
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");
}