关于指针的指针的问题,请名位高手帮帮忙!!

时间:2022-04-25 20:43:43
#include <iostream>

//An array of char pointers initialized with names.
char* Names[]=
{
    "Bill",
    "Sam",
    "Jim",
    "Paul",
    "Donald",
    0
}
// The main() function.
int main()
{
   //An pointer to pointer
    char* * nm=Names;  //<---------?????
   //Display the names.
    while(*nm!=0)
        std::cout<<*nm++<<std::endl;
    return 0;
}
这段程序小弟看不明白,希望高手们一一指点!谢谢!!!

11 个解决方案

#1



  char* Names[] 这个变量可以这样理解。它是一个数组,里面存放的是一些指针,这些指针再指向不同的地址。这里有个概念需要弄清楚,就是Names这个数值是一个连续的地址空间,而其中的元素指向的地址并不一定是连续的。因为这里无法给出类似图表的表示方式,我只能以数字来表示了。比如Names的地址空间是0x0001--0x0010,这是连续的概念,而数组元素指向的地址完全可以任意,只要有效就可以,比如其中第一个元素指向0x0100,第二个元素指向0x0900,这两个地址并不是连续的。

   std::cout<<*nm++<<std::endl
   这行代码表示打印出nm指向的地址的字符串,然后把nm这个指针地址往后移一个单位(指向下一个地址),比如一开始nm是0x0001上指向的地址0x0100打印出来,然后nm就+1变成了0x0002,下一次打印的就是0x0900上的字符了。好绕口,不知道能否理解^_^

#2


char* *-->指向字符指针的指针,
而char* Names[]的Names是一个装字符指针的数组,Names是这个数组的首地址,所以和char* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。

#3


借地,我也想问一下!不好意思!^O^
LPBYTE Buffer[3];
创建的是3个BYTE类型的指针,还是只是分配3字节的空间,再用Buffer指向分配好的空间!

Buffer[x]获取的是地址还是内容?

#4


#5


char* Names[]=
{
    "Bill",
    "Sam",
    "Jim",
    "Paul",
    "Donald",
    0
}
这个定义一个成员为char*的数组(即数组的每一个元素都是一个指向char指针)

char* * nm=Names;  //这一句是定义一个指向元素为char*的数组的指针。

while(*nm!=0)
        std::cout<<*nm++<<std::endl; //*nm取出数组是每个元素的值,即一个类型为char*的值,再将其输出
    

#6


to  vincentcsdn(vincent) :

  LPBYTE Buffer[3];语句当然在栈中分配了3个LPBYTE类型的地址空间,Buffer[0]-Buffer[2]的值为BYTE类型数据的地址。

#7


如果是byte abc[3]是有空间的换句话说,直接赋值是安全的,如果是*abc则需要初始化.

#8


嘿嘿

#9


来晚了。

#10


char* Names[]这里是定义一个指针数组,即数组所存储的是指向字符串的地址,char* *nm=name表示*nm这里存储的是name这个数组的首地址,而*nm+1就相当于name+1

#11


标记

#1



  char* Names[] 这个变量可以这样理解。它是一个数组,里面存放的是一些指针,这些指针再指向不同的地址。这里有个概念需要弄清楚,就是Names这个数值是一个连续的地址空间,而其中的元素指向的地址并不一定是连续的。因为这里无法给出类似图表的表示方式,我只能以数字来表示了。比如Names的地址空间是0x0001--0x0010,这是连续的概念,而数组元素指向的地址完全可以任意,只要有效就可以,比如其中第一个元素指向0x0100,第二个元素指向0x0900,这两个地址并不是连续的。

   std::cout<<*nm++<<std::endl
   这行代码表示打印出nm指向的地址的字符串,然后把nm这个指针地址往后移一个单位(指向下一个地址),比如一开始nm是0x0001上指向的地址0x0100打印出来,然后nm就+1变成了0x0002,下一次打印的就是0x0900上的字符了。好绕口,不知道能否理解^_^

#2


char* *-->指向字符指针的指针,
而char* Names[]的Names是一个装字符指针的数组,Names是这个数组的首地址,所以和char* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。

#3


借地,我也想问一下!不好意思!^O^
LPBYTE Buffer[3];
创建的是3个BYTE类型的指针,还是只是分配3字节的空间,再用Buffer指向分配好的空间!

Buffer[x]获取的是地址还是内容?

#4


#5


char* Names[]=
{
    "Bill",
    "Sam",
    "Jim",
    "Paul",
    "Donald",
    0
}
这个定义一个成员为char*的数组(即数组的每一个元素都是一个指向char指针)

char* * nm=Names;  //这一句是定义一个指向元素为char*的数组的指针。

while(*nm!=0)
        std::cout<<*nm++<<std::endl; //*nm取出数组是每个元素的值,即一个类型为char*的值,再将其输出
    

#6


to  vincentcsdn(vincent) :

  LPBYTE Buffer[3];语句当然在栈中分配了3个LPBYTE类型的地址空间,Buffer[0]-Buffer[2]的值为BYTE类型数据的地址。

#7


如果是byte abc[3]是有空间的换句话说,直接赋值是安全的,如果是*abc则需要初始化.

#8


嘿嘿

#9


来晚了。

#10


char* Names[]这里是定义一个指针数组,即数组所存储的是指向字符串的地址,char* *nm=name表示*nm这里存储的是name这个数组的首地址,而*nm+1就相当于name+1

#11


标记