我定义了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 字符,因为它应该只能指向一个。
答案 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];
请注意表达式const
中const char* const ptr
的双重使用。第一个意味着字符值是常量,第二个意味着指针本身是常量。后者阻止编写ptr++
,并且丢失了对字符串文字"12345"
开头地址的唯一句柄。
答案 2 :(得分:0)
如果你直接使用指针ptr,ptr存储的指向数组值的地址将会改变。在这个循环中:
while(*ptr != 0)
cout << *ptr++ << endl;
现在,ptr指向数组的末尾(\ 0)。
也许你应该在上面的循环之前执行最后一个循环。
通常,以尼克的方式更合适。