char *和char []之间的区别

时间:2011-09-27 03:54:03

标签: c++

我知道这是一个非常基本的问题。我很困惑为什么以及如何以下不同。

char str[] = "Test";
char *str = "Test";

8 个答案:

答案 0 :(得分:25)

char str[] = "Test";

chars的数组,使用“Test”中的内容进行初始化,而

char *str = "Test";

是指向文字(const)字符串“Test”的指针。

它们之间的主要区别在于第一个是数组,另一个是指针。该数组拥有其内容,恰好是"Test"的副本,而指针只是引用字符串的内容(在这种情况下是不可变的)。

答案 1 :(得分:7)

一个是指针,一个是数组。它们是不同类型的数据。

int main ()
{
   char str1[] = "Test";
   char *str2 = "Test";
   cout << "sizeof array " << sizeof(str1) << endl;
   cout << "sizeof pointer " << sizeof(str2) << endl;
}

输出

sizeof array 5
sizeof pointer 4

答案 2 :(得分:6)

指针可以重新指向别的东西:

char foo[] = "foo";
char bar[] = "bar";

char *str = foo;  // str points to 'f'
str = bar;        // Now str points to 'b'
++str;            // Now str points to 'a'

递增指针的最后一个示例表明,您可以轻松地迭代字符串的内容,一次一个元素。

答案 3 :(得分:5)

第一个

char str[] = "Test";

是一个包含五个字符的数组,使用值"Test"加上空终止符'\0'进行初始化。

第二个

char *str = "Test";

是指向文字字符串"Test"的内存位置的指针。

答案 4 :(得分:5)

区别在于使用的STACK内存。

例如,当为微控制器编程时,为堆栈分配的内存非常少,会产生很大的不同。

char a[] = "string"; // the compiler puts {'s','t','r','i','n','g', 0} onto STACK 

char *a = "string"; // the compiler puts just the pointer onto STACK 
                    // and {'s','t','r','i','n','g',0} in static memory area.

答案 5 :(得分:2)

从C ++ 11开始,第二个表达式现在无效,必须编写:

const char *str = "Test";

该标准的相关部分为附录C第1.1节:

  

更改:将字符串文字设为const

     

字符串文字的类型从“字符数组”更改为“数组”   字符char16_t字符串文字的类型从   “某些整数类型的数组”到“ const char16_t的数组”。   将char32_t字符串文字从“ some-integer-type的数组”更改为   改为“ const char32_t数组”。宽字符串文字的类型为   从“ wchar_t数组”更改为“ const wchar_t数组”。

     

理性:这避免了调用不适当的重载函数,   可能希望能够修改其参数。

     

对原始功能的影响:更改为定义明确的功能的语义。

答案 6 :(得分:1)

"Test"是一个包含五个字符的数组(4个字母,加上空终止符。

char str1[] = "Test";创建包含5个字符的数组,并将其命名为str1。您可以根据需要修改该数组的内容,例如: str1[0] = 'B';

char *str2 = "Test";创建包含5个字符的数组,不会为其命名,还会创建名为str2的指针。它将str2设置为指向包含5个字符的数组。您可以按照指针随意修改数组,例如: str2[0] = 'B';*str2 = 'B';。您甚至可以将该指针重新分配到其他位置,例如str2 = "other";

数组 引号中的文本。指针只指向它。你可以为每个人做很多类似的事情,但它们是不同的:

char str_arr[] = "Test";
char *strp = "Test";

// modify
str_arr[0] = 'B'; // ok, str_arr is now "Best"
strp[0] = 'W';    // ok, strp now points at "West"
*strp = 'L';      // ok, strp now points at "Lest"

// point to another string
char another[] = "another string";
str_arr = another;  // compilation error.  you cannot reassign an array
strp = another;     // ok, strp now points at "another string"

// size
std::cout << sizeof(str_arr) << '\n';  // prints 5, because str_arr is five bytes
std::cout << sizeof(strp) << '\n';     // prints 4, because strp is a pointer

对于最后一部分,请注意sizeof(strp)将根据体系结构而变化。在32位机器上,它将是4个字节,在64位机器上它将是8个字节。

答案 7 :(得分:-1)

我们来看看以下几种声明字符串的方式:

char name0 = 'abcd';           // cannot be anything longer than 4 letters (larger causes error)
cout << sizeof(name0) << endl; // using 1 byte to store

char name1[]="abcdefghijklmnopqrstuvwxyz"; // can represent very long strings
cout << sizeof(name1) << endl;             // use large stack memory

char* name2 = "abcdefghijklmnopqrstuvwxyz"; // can represent very long strings
cout << sizeof(name2) << endl;              // but use only 8 bytes

我们可以看到使用 char* variable_name 声明字符串似乎是最好的方法!它以最少的堆栈内存完成这项工作。