字符指针与字符串(1)

https://blog.csdn.net/mensaochun/article/details/52786539

https://blog.csdn.net/mikedadong/article/details/53047500

1)字符指针与字符数组之间的区别

字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,可以改变数组中保存的内容。

char string[ ]="This is a string.";

char *str = "This is a string.";

(a)实例:

char *str, *str1="This is another string.";

char string[100]="This is a string.";

则在程序中,可以使用如下语句:

str++; /* 指针str加1 */

str = "This is a NEW string."; /* 使指针指向新的字符串常量 */

str = str1; /* 改变指针str的指向 */

strcpy( string, "This is a NEW string.") /* 改变字符串的的内容 */

strcat( string, str) /* 进行串连接操作 */

在程序中,不能进行如下操作:

string++; /* 不能对数组名进行++运算 */

string = "This is a NEW string."; /* 错误的串操作 */

string = str1; /* 对数组名不能进行赋值 */

strcat(str, "This is a NEW string.") /* 不能在str的后面进行串连接 */

strcpy(str, string) /* 不能向str进行串复制 */

2)字符指针说明:可以使字符指针str指向不同的字符串,但不能改变str所指的字符串;

char* ptr = "abc";这种写法在c++标准中是不允许的,但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,

建议写法是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。

又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了。

3)数组说明:

数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

4)字符数组说明

字符串常量的类型可以理解为相应字符常量数组的类型, 如"abcdef"的类型就可以看成是const char[7];

 对于char str[] = "abcdef"; 就有sizeof(str) = 7,因为str的类型是char[7];问题?str不是指针么???

 也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]。

 对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*。

5)不管是字符数组,还是字符串;输出*p,仅仅输出字符串中的单个字符;输出指针p,会输出字符串指针p后面的内容,到'\0'截止;可以从后面的循环输出结果看出,输出*p与p的结果;

(a)

char str[] = "we are poor students";//这是一个字符串

char *p = str;

while (*p != '\0')

{

cout << *p;

p++;

}

(b)

char str[] = "we are poor students";//这是一个字符串

char *p = str;

while (*p != '\0')

{

cout << p;

p++;

}

猜你喜欢

转载自www.cnblogs.com/wllwqdeai/p/9231516.html