char指针和char数组之间的区别

时间:2012-12-05 02:33:55

标签: c++ arrays pointers

  

我定义了2个变量,一个是指针,一个是数组

char* ptr;
char* array;

ptr = "12345";
array = new int[5];

for(int i = 0; i < 5; i++)
    array[i] = i;

while(*ptr != 0)
        cout << *ptr++ << endl;

//Get garbage values
for(int i = 0; i < 5; i++)
    cout << ptr[i];
  

我想知道变量之间的主要区别是什么。   当我尝试在“ptr []”中打印值时,为什么我会得到垃圾值   数组方式,但迭代通过它时完全没问题   瓦莱斯。我似乎无法理解我的变量“ptr”如何指向5   字符,因为它应该只能指向一个。

3 个答案:

答案 0 :(得分:7)

指针和数组之间存在许多差异,但是你得到垃圾的原因是,当你使用带有索引的ptr时,它已经指向“12345”的空终止符。

每次你这样做:

*ptr++;

ptr指向它用于指向的下一个元素(即1,2,3,...)。当循环结束时,它指向空终止符\0,然后当您尝试使用i对其进行索引时,它指向未知内存。

我建议您使用临时指针代替迭代元素:

const char* ptr; // declaring ptr constant in this case is a good idea as well

...

ptr = "12345";
char *tmp = ptr;

...

while(*tmp != 0)
    cout << *tmp++ << endl;

答案 1 :(得分:2)

这里有三个概念:指向字符,动态数组和字符串文字的指针:

    // Initialise a character pointer to point to a dynamic array of characters
    char* array = new char[5];

    // Assign values pointed to.
    for(int i = 0; i < 5; i++)
        array[i] = i;
    // Read back the values.
    for(int i = 0; i < 5; i++)
         std::cout << array[i];

    // Initialise a character pointer to point to a string literal.
    const char* const ptr = "12345";

    const char* charIterator = ptr;
    while(*charIterator != 0)
        std::cout << *charIterator << std::endl;

    //Another way to read values.
    for(int i = 0; i < 5; i++)
        std::cout << ptr[i];

请注意表达式constconst char* const ptr的双重使用。第一个意味着字符值是常量,第二个意味着指针本身是常量。后者阻止编写ptr++,并且丢失了对字符串文字"12345"开头地址的唯一句柄。

答案 2 :(得分:0)

如果你直接使用指针ptr,ptr存储的指向数组值的地址将会改变。在这个循环中:

while(*ptr != 0)

   cout << *ptr++ << endl;

现在,ptr指向数组的末尾(\ 0)。

也许你应该在上面的循环之前执行最后一个循环。

通常,以尼克的方式更合适。