3

我定义了 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 []”中的值时会得到垃圾值,但是在遍历 vales 时完全没问题。我似乎无法理解我的变量“ptr”如何指向 5 个字符,因为它应该只能指向一个。

4

3 回答 3

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;
于 2012-12-05T02:35:57.007 回答
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];

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

于 2012-12-05T02:56:58.250 回答
0

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

while(*ptr != 0)

   cout << *ptr++ << endl;

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

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

通常,按照尼克的方式做更合适。

于 2012-12-05T03:24:10.557 回答