char指针的问题**p
本人学C++有一段时间了,最近回头看C++概念搞得很混乱。
比方说:
void GetMemory(char **p)
{ *p=(char *)malloc(100); }
void main()
{ char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
cout<<str;
}
对于为什么是**p这个问题我一直有疑问的,虽然我上机操作过知道如果是*p是无法传递str的.
我对概念的理解:
char型指针是个常量指针,指针str输出的是hello,原因是函数进行了如下重载
ofstream& operator<<(ostream&out,const char *p)
{ return cout<<*p; }
那么这里的str到底是什么东西,没重载前是什么,地址吗?
C/C++重载的东西很多,再问下哪个文件可以找到呢?
敬请指教,不胜感激!
[解决办法]
如果定义char **p = {"apex", "smart", "recog", "tek"};
那么*p等于"apex", *p++可以依次取值。
**p相当于char* p[]
你这里str已经是char指针了,那么对str再取指针只能用**p表示了,指针的指针。
PS: 我也初学,如有不正确之处,欢迎楼下拍砖。
[解决办法]
void GetMemory(char **p)
{ *p=(char *)malloc(100); }
在函数中要改变是*p自身的值, 这是一个指向字符串的指针,要改变一个指针的值。 因此在函数的形参就需要传递该指针(*p)的地址,即**p。 如果要改变的是一个char值,形参是p的地址,*p就可以。
[解决办法]
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的
类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区
1、指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部
分就是这个指针的类型。
2、从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声
明符*去掉,剩下的就是指针所指向的类型。
3、指针的值----或者叫指针所指向的内存区或地址
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而
不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位
整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就
是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类
型)的一片内存区。
4、指针本身所占据的内存区
在32 位平台里,指针本身占据了4 个字节的长度。
http://download.csdn.net/download/xixilala/1296409这个资源很不错,楼主可以看下
[解决办法]
你明明知道这个要传地址,那还有什么疑惑呢,char* *p,这样可能就好理解了,p这个形参只是为了让你把真正的堆内存地址传给str。
其实,你学了C++,有更容易理解的方式。
#include <IOSTREAM>
using namespace std;
void GetMemory(char* &p)
{
p=(char *)malloc(100);
}
void main()
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello");
cout<<str;
}
//
void GetMemory(char **p)
{
*p=(char *)malloc(100);
}
void main()
{
char *str=NULL;
//这里可以理解为 (char*) str = NULL;先不看*号
GetMemory(&str,100);
strcpy(str,"hello");
cout<<str;
}
//str本身是char *类型 又经过& 故接收为char **
void GetMemory(char **p)
{
//p表示str的地址,*p是表示str的本身变量的值即str存放的地址,这里需要改变
*p=(char *)malloc(100);
}
void main()
{
//这里可以理解为 (char*) str = NULL;先不看*号。str是一个指针,str当前存放的是一个无效的随机地址
char *str=NULL;
//需要改变str本身的值,即改变它存放的地址,用&符号,可以理解为 需要改变这个本身的内容,而不是指向的内容
GetMemory(&str,100);
//现在str内存放的地址指向你新申请内存
strcpy(str,"hello");
cout<<str;
}