社区
C++ 语言
帖子详情
请教 二重指针 赋值
LeonTown
2009-05-13 03:07:51
如题,
代码如下:
const char **pszChArr = {"1", "2"}; //1. 编译错误。
为什么啊?
为什么const char* pszChArr2[] = {"1", "2"}; 就可以?
是因为,pszChArr2后面有个[],就给它分配内存了吗?
这里,我不想用new的方式,申请内存。
就用类似于 const char* pszCh = "1" 的方式,
给上述二重指针pszChArr赋值。
谢谢!
...全文
742
28
打赏
收藏
请教 二重指针 赋值
如题, 代码如下: const char **pszChArr = {"1", "2"}; //1. 编译错误。 为什么啊? 为什么const char* pszChArr2[] = {"1", "2"}; 就可以? 是因为,pszChArr2后面有个[],就给它分配内存了吗? 这里,我不想用new的方式,申请内存。 就用类似于 const char* pszCh = "1" 的方式, 给上述二重指针pszChArr赋值。 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fairchild811
2009-05-13
打赏
举报
回复
指针和数组吧
papaofdoudou
2009-05-13
打赏
举报
回复
引用一位大侠的话:
1.数组名不是指针:表现在:
int a[10];
int *p;
cout<<sizeof(a)<<endl;
cout<<sizeof(p)<<endl;
一个输出10,一个输出4,不相等。
2.数组名神似指针。表现在
可以将上面的程序中:
p=a; 将数组名赋值给指针p;
引用一位网友的话:
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!
papaofdoudou
2009-05-13
打赏
举报
回复
[Quote=引用 21 楼 lingyin55 的回复:]
兄弟,问题是char *p指向的是一个字符串,不是指向一个数组。。
要指向数组,可以这样
char p[4] = {1,3,4};
char (*pp)[4] = p;
[/Quote]
此句欠妥,pp是一个一维数组的指针,而p作为右值的时候退化为一个char* 类型的指针,代码
char p[4] = {1,3,4};
char (*pp)[4] = p;
是无法通过编译的,只能这样写
char p[4]={'a','b','c'};
char *pp;
pp=p;
至于为什么
char *p = {1,3,4};有错,而char p[4]={..}没有错,还是那句话,指针数组名本质上不是指针,你无法利用数组的初始化方式初始化一个指针,虽然有的时候在函数传值,和进行指针赋值(例如上句中pp=p;)可以讲数组地址传给普通指针,但是本质上讲是因为p指针在传递给pp的时候退化成一个普通指针了,这个时候是完全将数组地址传递给普通指针变量的。
国内很多书都把数组名和指针画上等号,其实是错误的,一个很简答的例子就可以证明:
int a[10];
int *pint;
cout<<sizeof(a)<<endl; //输出会是10;
cout<<sizeof(pint)<<endl; //输出会是4;
如果a是指针,在32位机上地址占用四个字节,输出应该和pint一样也是4,但本质上a代表一种数据结构,它是一种内有10个int变量的数据结构,而pint是一个指针,一个只能存储一个这样int数据类型的指针,当你进行
pint=a;
的时候,编译器不会报错,但是并不是说明a就和pint具有相同的意义。a在进行地址传递和地址赋值的时候会退化成a[0]元素的地址,也就是一个指针。
SimonYeung
2009-05-13
打赏
举报
回复
感谢分享 学习
FengRider
2009-05-13
打赏
举报
回复
[Quote=引用楼主 LeonTown 的帖子:]
如题,
代码如下:
const char **pszChArr = {"1", "2"}; //1. 编译错误。
为什么啊?
为什么const char* pszChArr2[] = {"1", "2"}; 就可以?
是因为,pszChArr2后面有个[],就给它分配内存了吗?
这里,我不想用new的方式,申请内存。
就用类似于 const char* pszCh = "1" 的方式,
给上述二重指针pszChArr赋值。
谢谢!
[/Quote]
在C++中,每一个变量或者常量,都有两个值,一个左值,表示地址值,一个右值,表示数据值。
const char **pszChArr这个表达示,定义的是一个指针型的变量,其右值是一个char *,如果要给pszChArr赋值,应该将一个char *的数据赋给它,{“1”,“2”}这个表达示,表示的是由两个常量字符串组成的数组,和pszChArr完全不搭调,没办法进行赋值运算。
const char * pszChArr2[],这个表达示定义的是一个const char *类型的数组,你从右往左看过来,先是[],说明是一个数组,再看*,说明是一个指针型的数组,再看char,说明是字符指针型的数组,最后再看const,哦,原来是一个常量字符指针数组啊。给数组赋值,可不就用{}这种表达示。里面"1"和"2"可不就是常量字符串。
使用new是在堆里面动态开辟一段内存空间出来。如果你不想在堆里面动态开辟内存空间出来,代码区是不可能了,或者在静态存储区,或者在栈里面开辟空间。无论是在栈或者静态存储区开辟空间,你总得告诉编译器,你要多大的空间吧。不然编译器怎么分配空间给你。一般这种情况是事先要求开辟一个足够大的空间出来,然后让pszChArr指向这段空间。比如:
char strSpace[1024][1024] = {{0},{0});
char ** pszChArr = strSpace;
这里要明白一件事,pszChArr本身只是一个指针变量,编译给它分配的空间并不是1024*1024个Char型的空间,仅仅只是一个Char *型的空间。你用sizeof(pszChArr)就知道才多大一点了。只是pszChArr的数据值是个地址,表示一段连续Char空间的首地址。地址值和数据值,也就是左值和右值的概念,一定要分清,不然用指针的时候,怕是比较危险。
lingyin55
2009-05-13
打赏
举报
回复
恩,你再好好理解下吧,其实我看了我1楼回的,说的也不是很好,主要原因还是你要看
指针指向什么类型。指向int的指针当然不能初始化指向double的指针,除非你强制类型转换
,这里也是类似的。
[Quote=引用 22 楼 LeonTown 的回复:]
引用 21 楼 lingyin55 的回复:
兄弟,问题是char *p指向的是一个字符串,不是指向一个数组。。
要指向数组,可以这样
char p[4] = {1,3,4};
char (*pp)[4] = p;
引用 20 楼 LeonTown 的回复:
引用 19 楼 lingyin55 的回复:
p是指向一个char的指针,这里p不是指向一个char的数组,所以你只能用一个
地址初始化它,不能用数组的方式初始化。。。
引用 18 楼 LeonTown 的回复:
引用 15 楼 tugouxp 的回复:
…
[/Quote]
LeonTown
2009-05-13
打赏
举报
回复
[Quote=引用 21 楼 lingyin55 的回复:]
兄弟,问题是char *p指向的是一个字符串,不是指向一个数组。。
要指向数组,可以这样
char p[4] = {1,3,4};
char (*pp)[4] = p;
引用 20 楼 LeonTown 的回复:
引用 19 楼 lingyin55 的回复:
p是指向一个char的指针,这里p不是指向一个char的数组,所以你只能用一个
地址初始化它,不能用数组的方式初始化。。。
引用 18 楼 LeonTown 的回复:
引用 15 楼 tugouxp 的回复:
引用 12 楼 hao2736 的回复:
我…
[/Quote]
哦~
似乎,《程序员面试宝典》里,专门有一节,就讲类似的问题。
lingyin55
2009-05-13
打赏
举报
回复
兄弟,问题是char *p指向的是一个字符串,不是指向一个数组。。
要指向数组,可以这样
char p[4] = {1,3,4};
char (*pp)[4] = p;
[Quote=引用 20 楼 LeonTown 的回复:]
引用 19 楼 lingyin55 的回复:
p是指向一个char的指针,这里p不是指向一个char的数组,所以你只能用一个
地址初始化它,不能用数组的方式初始化。。。
引用 18 楼 LeonTown 的回复:
引用 15 楼 tugouxp 的回复:
引用 12 楼 hao2736 的回复:
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
呵呵,这种困惑我以前也有,后来想通了,说道底指针和数组…
[/Quote]
LeonTown
2009-05-13
打赏
举报
回复
[Quote=引用 19 楼 lingyin55 的回复:]
p是指向一个char的指针,这里p不是指向一个char的数组,所以你只能用一个
地址初始化它,不能用数组的方式初始化。。。
引用 18 楼 LeonTown 的回复:
引用 15 楼 tugouxp 的回复:
引用 12 楼 hao2736 的回复:
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
呵呵,这种困惑我以前也有,后来想通了,说道底指针和数组名还是有很大区别的,国内好多书…
[/Quote]
数组不也是有首地址吗?
把首地址赋给p?
lingyin55
2009-05-13
打赏
举报
回复
p是指向一个char的指针,这里p不是指向一个char的数组,所以你只能用一个
地址初始化它,不能用数组的方式初始化。。。
[Quote=引用 18 楼 LeonTown 的回复:]
引用 15 楼 tugouxp 的回复:
引用 12 楼 hao2736 的回复:
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
呵呵,这种困惑我以前也有,后来想通了,说道底指针和数组名还是有很大区别的,国内好多书籍都在灌输数组名就是指针,我们也算是其受害者吧,你可以这样理解,char*p声明了一个指针,而char p[4]换一种写法就是char[4] p,也就是声明了一种char[4]类型…
[/Quote]
LeonTown
2009-05-13
打赏
举报
回复
[Quote=引用 15 楼 tugouxp 的回复:]
引用 12 楼 hao2736 的回复:
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
呵呵,这种困惑我以前也有,后来想通了,说道底指针和数组名还是有很大区别的,国内好多书籍都在灌输数组名就是指针,我们也算是其受害者吧,你可以这样理解,char*p声明了一个指针,而char p[4]换一种写法就是char[4] p,也就是声明了一种char[4]类型的结构,虽然后面这种写法是不…
[/Quote]
但为什么
char *p = {1,3,4};有错?
xunfeng_2008
2009-05-13
打赏
举报
回复
基本不是很扎实,需要学习,这是C、C++的重点
lingyin55
2009-05-13
打赏
举报
回复
见1楼解释
[Quote=引用 14 楼 LeonTown 的回复:]
引用 12 楼 hao2736 的回复:
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
顺便问一下各位,
上述代码,为什么有错啊?
[/Quote]
papaofdoudou
2009-05-13
打赏
举报
回复
[Quote=引用 12 楼 hao2736 的回复:]
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
[/Quote]
呵呵,这种困惑我以前也有,后来想通了,说道底指针和数组名还是有很大区别的,国内好多书籍都在灌输数组名就是指针,我们也算是其受害者吧,你可以这样理解,char*p声明了一个指针,而char p[4]换一种写法就是char[4] p,也就是声明了一种char[4]类型的结构,虽然后面这种写法是不能通过编译的,但是这样理解是正确的。
LeonTown
2009-05-13
打赏
举报
回复
[Quote=引用 12 楼 hao2736 的回复:]
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
[/Quote]
顺便问一下各位,
上述代码,为什么有错啊?
papaofdoudou
2009-05-13
打赏
举报
回复
可以写成这样的:
#include <iostream>
using namespace std;
void main()
{
const char **pszChArr;
pszChArr=new const char*[2];
pszChArr[0]="1";
pszChArr[1]="2";
const char* pszChArr2[] = {"1", "2"};
}
pszChArr 只是一个指针的指针,如果想那样用,必须把它看成另外一个指针数组的首地址,也就是必须首先为每个元素分配空间 pszChArr=new const char*[2]; 代码就完成这个工作的。
hao2736
2009-05-13
打赏
举报
回复
我也用同样的困惑,赋值时最好用数组,不会出错。char *p = {1,3,4};有错,但char p[4] = {1,3,4};可以。有点昏
LeonTown
2009-05-13
打赏
举报
回复
[Quote=引用 10 楼 lqc888888 的回复:]
const char* pszChArr2[] 中,pszChArr2是一个指针数组,其中的元素代表了字符串"1"和字符串"2"的地址. **pszChArr 是指针,只能将单个的地址赋给它.
[/Quote]
好!
给分!
lqc888888
2009-05-13
打赏
举报
回复
const char* pszChArr2[] 中,pszChArr2是一个指针数组,其中的元素代表了字符串"1"和字符串"2"的地址. **pszChArr 是指针,只能将单个的地址赋给它.
lpf000
2009-05-13
打赏
举报
回复
一个是 指针的指针,一个是指针的数组
加载更多回复(8)
二维数组与
二重
指针
赋值
问题之实验
前一段时间做了一个关于二维数组和
二重
指针
的互相
赋值
的实验,很有意思,特记录下来。由于数组是
指针
的语法糖,所以我之前一直认为两者可直接进行
赋值
转换。后来发现在二维数组中这样做是不可行的,现将实验现象记录如下: 实验: #include <stdio.h> int main(int argc,char *argv[]) { int a[2][5]={{1,2,3,4,5},{...
二维数组和
二重
指针
的疑问 二维数组名为什么不能直接
赋值
给
二重
指针
#include extern void print_double_point_address_value_p(int **p, int *p1); void main(){ int array[3][2] = {10,11,12,13,14,15}; int *array3[2]; int **pa3 =&array3[0];
二重
指针
、二维数组及二者如何进行
赋值
如果已经定义了一个
指针
类型,我们再定义一个
指针
,用于指向已经定义的
指针
变量,后面定义的
指针
变量就是一个指向
指针
的
指针
变量,简称指向
指针
的
指针
,这样的
指针
也称
二重
(级)
指针
。 一、一般情况的例子: #include <iostream> using namespace std; int main(){ int **p; int c = 2; int *b = &c; p = &b; cout << p <<
c语言怎么给
二重
指针
赋值
,C语言
二重
指针
的运用
『摘要』本文主要通过实例展示C/C++中
二重
指针
的用法和用途,对于诸如二叉树等递归定义的数据结构有一定的指导作用。【关键字】:C/C++、
二重
指针
、递归本人最近想实现一个B+树,虽然对B+树的理论有一定的认识,但由于考研花去大量时间复习功课,对C的一些细节有所遗忘,因此决定从二叉树的实现开始。但刚写完二叉树的创建函数且在编译通过之后,调试时却出现了问题。二叉树是一种递归定义的数据结构,因此其创建函...
c语言二维数组
赋值
给
二重
指针
,C语言
二重
指针
的运用
『摘要』本文主要通过实例展示C/C++中
二重
指针
的用法和用途,对于诸如二叉树等递归定义的数据结构有一定的指导作用。【关键字】:C/C++、
二重
指针
、递归本人最近想实现一个B+树,虽然对B+树的理论有一定的认识,但由于考研花去大量时间复习功课,对C的一些细节有所遗忘,因此决定从二叉树的实现开始。但刚写完二叉树的创建函数且在编译通过之后,调试时却出现了问题。二叉树是一种递归定义的数据结构,因此其创建函...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章