C语言中的指针和字符串的赋值
前言:温习下以前学过的C语言知识,温故而知新。
实例说明
本文用一段实例代码阐述指针和字符串的联系。
#include <iostream>
#include <cstring>
int main()
{
using namespace std;
char animal[20] = "bear";
const char * bird = "wren";
char * ps;
cout << animal << " and ";
cout << bird << "\n";
cout << "Enter a kind of animal: ";
cin >> animal;
ps = animal;
cout << ps << "s!\n";
cout << "before use strcpy(): \n";
cout << animal << " at " << (int *)animal << endl;
cout << ps << " at " << (int *)ps << endl;
ps = new char[strlen(animal) + 1];
strcpy(ps, animal);
cout << "after using strcpy(): \n";
cout << animal << " at " << (int *)animal << endl;
cout << ps << " at " << (int *)ps << endl;
delete[] ps;
return 0;
};
代码输出:
代码中语句:const char * bird = "wren";以这种方式使用const意味着可以用bird来访问字符串,但不能修改它。
语句:
cout << animal << " and ";
cout << bird << "\n";
这两个语句表明:给cout提供一个指针,它将打印地址,但如果指针类型为char*,则cout将显示指向的字符串,此处animal也是一个char类型的地址,在C++中将字符数组名解释为字符数组的首地址。 如果要显示字符串的地址,则必须将这种指针强制转换为另一种指针类型,如*int。因此,ps被现实为fox,而(int *)ps被显示为字符串的地址。
语句:ps = animal;将animal赋给ps并不会复制字符串,而是只复制地址,这样两个指针将指向相同的内存单元。
下面这两条语句是为了获得animal所指向字符串的副本。
ps = new char[strlen(animal) + 1];
strcpy(ps, animal);
语句:ps = new char[strlen(animal) + 1];字符串"fox"不能填满整个animal数组,为了防止浪费不必要的空间,使用strlen()来确定字符串的长度,并将它加1来获得包含空字符时该字符串的长度,随后程序用new来分配刚好足够存储该字符串的空间。
接下来,需要将animal数组中的字符串复制到新分配的空间中。将animal赋给ps是不行的,这样只能修改存储在ps中的地址,从而失去程序访问新分配内存的唯一途径。需要使用库函数strcpy();
strcpy(ps,animal);//copy string to new storage
strcpy()函数接受2个参数。第一个是目标地址,第二个是要复制的字符串的地址,在使用该函数前,需确定ps有足够的空间来存储animal所指向的字符串,所以此处用strlen()来确定所需的空间,并使用new获得可用的内存。通过new和strcpy,获得了fox的两个独立副本。如上图中输出结果中显示的两个不同的字符串地址。
总结
将字符串复制到数组中,初始化数组时,请使用=操作符。否则请使用strcpy()。
char food[20] = "carrots";
///以下形式也可以
strcpy(food,"flan");
如果在使用strcpy()函数时,要存储的字符串长度超过了字符数组的长度,程序可能会产生未知的错误,这一点需要特别注意。
应使用strcpy()或stmcpy()函数而不是使用赋值操作符来将字符串赋给数组。