首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

char指针的有关问题*p

2013-12-13 
char指针的问题**p本人学C++有一段时间了,最近回头看C++概念搞得很混乱。比方说:void GetMemory(char **p){

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;
}

[解决办法]
引用:
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的
类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区
1、指针的类型
   从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部
   分就是这个指针的类型。
2、从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声
   明符*去掉,剩下的就是指针所指向的类型。……

第2点少了一句话
2、指针所指向的类型
   从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声
   明符*去掉,剩下的就是指针所指向的类型。
我发现刚发的那个链接打不开了,楼主试下这个,是一样的资源
http://download.csdn.net/detail/lewefe/2254190
[解决办法]

//
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;
}

[解决办法]
lz可以下载这篇文章看看,从指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区,指针与数组的关系,指针与函数的关系等等

http://pan.baidu.com/share/link?shareid=133450&uk=2718858870
[解决办法]
引用:
本人学C++有一段时间了,最近回头看C++概念搞得很混乱。
比方说:
void GetMemory(char **p)
{ *p=(char *)malloc(100); }
void main()
{  char *str=NULL;
   GetMemory(&amp;str,100);
   strcpy(str,"hello");
   ……



void GetMemory(char *p);此时,参数是一个char类型的指针,如果传进实参,那么就会有一个实参的拷贝,也就是说p就是实参的另一份了,此时在函数体重申请了内存,并赋值,没有问题,但是返回时,并没有给了实参,实参还是没有申请空间,此时,内存中就出现了一份“hello"但是没有指针来指向它。内存泄露。如果使用char**p,此时形参是一个指针的指针,也就是地址的地址,此时,传进实参,那么实参就是一个地址值,在函数体中我们可以来修改地址值来为实参申请空间。就像swap(int *a,int *b)可以交换两值,而swap(int a,int b)并没有交换两值。其实指针参数也是拷贝了一份,而地址参数是没有拷贝的,所以你修改了地址那么就相当于修改了实参的信息。
[解决办法]
int a;
&a的类型就是 int *,指针指向“整数”,通过该指针操作的就是int

double a;
&a的类型就是 double *,指针指向“双精度数据”,通过该指针操作的就是double

老虎 a;
&a的类型就是 老虎 *,指针指向“老虎”,通过该指针操作的就是“老虎”

int a[20];
&a的类型就是 int(*)[20],指针指向“有20个元素的一维整形数组”。




热点排行