//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* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。
而char* Names[]的Names是一个装字符指针的数组,Names是这个数组的首地址,所以和char* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。
#3
借地,我也想问一下!不好意思!^O^
LPBYTE Buffer[3];
创建的是3个BYTE类型的指针,还是只是分配3字节的空间,再用Buffer指向分配好的空间!
Buffer[x]获取的是地址还是内容?
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*的值,再将其输出
{
"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类型数据的地址。
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* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。
而char* Names[]的Names是一个装字符指针的数组,Names是这个数组的首地址,所以和char* *是同级的。
楼主要好好学学指针,象指针的指针更是很有用,可以实现不带继承的多态。
#3
借地,我也想问一下!不好意思!^O^
LPBYTE Buffer[3];
创建的是3个BYTE类型的指针,还是只是分配3字节的空间,再用Buffer指向分配好的空间!
Buffer[x]获取的是地址还是内容?
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*的值,再将其输出
{
"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类型数据的地址。
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
标记