Visual C++中二级指针的定义,初始化,赋值问题

本人学习C++不久,如果问题问得白痴了点请勿见怪!#include<iostream.h>voidmain(){charb[12]={'a','b','c','d','e... 本人学习C++不久,如果问题问得白痴了点请勿见怪!
#include<iostream.h>
void main()
{
char b[12]={'a','b','c','d','e','f','g','h','i','j','k','l'},*p;
p=b;//一级指针可以用这样的表达式赋值
cout<<&p<<endl;
char a[3][4]={'a','b','c','d','e','f','g','h','i','j','k','l'};
char **t;
t=a;//二级指针用这种表达式提示错误.
cout<<&t<<endl;
}
上面程序中二级指针赋值语句错误,错误提示为
D:\我的文档\桌面\y.cpp(9) : error C2440: '=' : cannot convert from 'char [3][4]' to 'char ** '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.
请高手教教为什么会出错,二级指针又该如何定义,初始化,赋值???谢谢
展开
 我来答
魔高丈
2009-02-24 · TA获得超过9506个赞
知道大有可为答主
回答量:2066
采纳率:0%
帮助的人:3470万
展开全部
二级指针和二维数组并不等价。

二级指针是一个指向指针的指针
而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;

所以不能直接:t=a;
要这样:t = (char **)a;

以下转帖:
今日在论坛上看到有人问到指针的问题,我想通过这样的例子来阐述几个常见的错误,并加深对二
级指针和二维数组之间关系的理解.
我们知道char array[]=”abcdef”; array是数组的首地址,
那么在二维数组中array当然也是数组的首地址,
看看这个定义char Array[][3] ={“ab“,“cd“,“ef“};
怎么知道的呢?定义这样一个数组,在vc调试窗口中
我们看到:
Array ---------0x64324234
|------Array[0]---0x64324234 “ab“
|------Array[1]---0x64324337 “cd“
|------Array[2]---0x6432433A “ef”
已经很明白了,实际编译器是这样实现二维数组的,实际上Array是“一维指针数组“的首地址,其中每一个元素指针都对应一个字符串,那么好我们来看看是否可以这样来使用Array二维数组.
char **pArray = Array;编译器提示出错,怎么办呢?加个(char **)试试,仍然出错,设断看一下pArray的值和Array的值是相等的,但我们是否可以象使用Array[i]那样来同样输出字符串呢?很明显是不行的,编译器不会把pArray+i处理成pArray+i*3寻找到第i个指针的地址,而只是简单的加了一个i.这说明编译器只做了很简单的将地址值赋给了pArray,而它实际没有任何意义.我们不能用它来访问任何数据.很奇怪吗?
再来看看这样定义char *p[] = {“ab“, “cd“, “ef“};定义了一个指针数组.char **sp = p;这样的用法经常看到,为什么这样就可以使用sp[i]来访问字符串了呢,的确编译器在编译的时候识别出了sp是一个指向一维数组的指针的指针,那么我们就可以把它做为数组名来操纵整个数组了,c神奇的地方或者说精华的地方就在这里了,希望这篇文章对那些对指针或二级指针有疑惑的朋友能够有所帮助,这也是我blog里的第一篇文章,呵呵.
杭州SEO顾问
2016-01-08 · TA获得超过478个赞
知道答主
回答量:285
采纳率:50%
帮助的人:80.1万
展开全部
二级指针和二维数组并不等价。

二级指针是一个指向指针的指针
而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;

所以不能直接:t=a;
要这样:t = (char **)a;

以下转帖:
今日在论坛上看到有人问到指针的问题,我想通过这样的例子来阐述几个常见的错误,并加深对二
级指针和二维数组之间关系的理解.
我们知道char array[]=”abcdef”; array是数组的首地址,
那么在二维数组中array当然也是数组的首地址,
看看这个定义char Array[][3] ={“ab“,“cd“,“ef“};
怎么知道的呢?定义这样一个数组,在vc调试窗口中
我们看到:
Array ---------0x64324234
|------Array[0]---0x64324234 “ab“
|------Array[1]---0x64324337 “cd“
|------Array[2]---0x6432433A “ef”
已经很明白了,实际编译器是这样实现二维数组的,实际上Array是“一维指针数组“的首地址,其中每一个元素指针都对应一个字符串,那么好我们来看看是否可以这样来使用Array二维数组.
char **pArray = Array;编译器提示出错,怎么办呢?加个(char **)试试,仍然出错,设断看一下pArray的值和Array的值是相等的,但我们是否可以象使用Array[i]那样来同样输出字符串呢?很明显是不行的,编译器不会把pArray+i处理成pArray+i*3寻找到第i个指针的地址,而只是简单的加了一个i.这说明编译器只做了很简单的将地址值赋给了pArray,而它实际没有任何意义.我们不能用它来访问任何数据.很奇怪吗?
再来看看这样定义char *p[] = {“ab“, “cd“, “ef“};定义了一个指针数组.char **sp = p;这样的用法经常看到,为什么这样就可以使用sp[i]来访问字符串了呢,的确编译器在编译的时候识别出了sp是一个指向一维数组的指针的指针,那么我们就可以把它做为数组名来操纵整个数组了,c神奇的地方或者说精华的地方就在这里了,希望这篇文章对那些对指针或二级指针有疑惑的朋友能够有所帮助,这也是我blog里的第一篇文章,呵呵.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鸢梨的小布丁
2015-11-08 · TA获得超过2.8万个赞
知道大有可为答主
回答量:2.3万
采纳率:21%
帮助的人:2204万
展开全部
char **p和char *p[]基本一样
区别讲不出来,写个例子体会。

#include <iostream>
using namespace std;
void main()
{
// 第一种初始化方法
char **p = new char *[10];
// 赋值后正常使用
p[0] = "aaa";
cout<<p[0]<<endl;
// 值可以改变
p[0] = "bbb";
// 未赋值使用会崩。编译能过。
//cout<<p[1]<<endl;
// 越界赋值,编译能过,运行能过,输出时崩。
//p[100] = "ccc";
//cout<<p[100]<<endl;

// 第二种初始化方法
unsigned int i = 0;
char** pP = NULL;
pP = (char**)calloc(128, sizeof(char*));
for (i = 0; i < 128; ++i)
{
pP[i] = (char*)calloc(128, sizeof(char));
}
// 这种初始化方法,好像不存在越界。
pP[1000] = "ddd";
cout<<pP[1000]<<endl;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
亲爱的9427
2016-05-20
知道答主
回答量:9
采纳率:0%
帮助的人:7549
展开全部
二级指针和二维数组并不等价。

二级指针是一个指向指针的指针
而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;

所以不能直接:t=a;
要这样:t = (char **)a;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式