![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C++中的指针问题
constchar*charPointArray[]={"China","Ameria","India"};//声明一个指针数组,本质是数组,每个item都是一个指针ch...
const char *charPointArray[] = { "China", "Ameria", "India" };//声明一个指针数组,本质是数组,每个item都是一个指针
char someAddress[] = { 'H','e','l','l','o' };
char(*charArrayPoint)[5] = &someAddress;//声明一个指向有5个char item的数组的指针,本质是指针
//char *p = someAddress 等价于 *p = &someAddress[0]
char *p1 = (char *) (&someAddress + 1);//取数组地址,然后加1表示步进为整个数组,即加到数组的末尾后一位了
char *p2 = (char *)(&someAddress[0] + 1);//取数组首位的地址,然后加1表示步进为数组的一项,即加到的第二项
printf("%s, %s, %c, %c, %c, %c",
charPointArray[0] /* ①打印第一个char指针的内容 */,
*(charPointArray[0]) /* ②取数组指针中第一个指针,并指向目标内容(charArrayPoint感觉也有数组的属性) */,
(*charArrayPoint)[1] /* ③取指向数组的内容,然后取数组的下标为1的内容(本身的指针属性) */,
*(p1 -1) /* 往前推1项,即查找数组的倒数第一项 */,
*(p2 - 1) /* 往前推1项,即查找数组的第一项 */);
根据上面这一段代码有如下问题:
Q1:①代码处,为何可以不加解引用符号呢?该问题可以扩展为,C/C++中何时要加*何时又不加*?
Q2:②代码处,这句代码编译能通过,但运行时报错,为什么呢?
Q3:③代码处,数组指针,本质虽然是一个指针,但是否真的有“数组的属性”呢?因为这个取值的方法简直就和数组一样!
Q4:实际开发当中用定义p1,p2的方法就能替代数组指针的使用场景,那为何还要设计“数组指针”这个东东呢?纯粹用来增加学习难度的么T_T? 展开
char someAddress[] = { 'H','e','l','l','o' };
char(*charArrayPoint)[5] = &someAddress;//声明一个指向有5个char item的数组的指针,本质是指针
//char *p = someAddress 等价于 *p = &someAddress[0]
char *p1 = (char *) (&someAddress + 1);//取数组地址,然后加1表示步进为整个数组,即加到数组的末尾后一位了
char *p2 = (char *)(&someAddress[0] + 1);//取数组首位的地址,然后加1表示步进为数组的一项,即加到的第二项
printf("%s, %s, %c, %c, %c, %c",
charPointArray[0] /* ①打印第一个char指针的内容 */,
*(charPointArray[0]) /* ②取数组指针中第一个指针,并指向目标内容(charArrayPoint感觉也有数组的属性) */,
(*charArrayPoint)[1] /* ③取指向数组的内容,然后取数组的下标为1的内容(本身的指针属性) */,
*(p1 -1) /* 往前推1项,即查找数组的倒数第一项 */,
*(p2 - 1) /* 往前推1项,即查找数组的第一项 */);
根据上面这一段代码有如下问题:
Q1:①代码处,为何可以不加解引用符号呢?该问题可以扩展为,C/C++中何时要加*何时又不加*?
Q2:②代码处,这句代码编译能通过,但运行时报错,为什么呢?
Q3:③代码处,数组指针,本质虽然是一个指针,但是否真的有“数组的属性”呢?因为这个取值的方法简直就和数组一样!
Q4:实际开发当中用定义p1,p2的方法就能替代数组指针的使用场景,那为何还要设计“数组指针”这个东东呢?纯粹用来增加学习难度的么T_T? 展开
5个回答
展开全部
①代码处,为何可以不加解引用符号呢?
因为charPointArray[0]是一个char类型的指针,以%s输出一个字符串时,只需指定一个char类型的指针(此指针的值正是所需要的、字符串的首地址)。如若写成*charPointArray[0],则是输出一个字符了,当然不行。
②代码处,这句代码编译能通过,但运行时报错,为什么呢?
因为*(charPointArray[0])的值是字符C(ASCII为67),当以%s输出它时,会把67解释为字符串的首地址,因为指定了首地址,所以能通过编译。但到运行时,去取这个字符串时,OS会阻止程序去读取首地址为67的内存块,因为本程序无权访问这块内存,所以发生运行时错误。
③代码处,数组指针,本质虽然是一个指针,但是否真的有“数组的属性”呢?
对于指针p,C/C++有规定p[i]等同于*(p+i)。因为charArrayPoint也是一个指针,因此(*charArrayPoint)[1]等同于(*(charArrayPoint+0))[1]亦等同于charArrayPoint[0][1],更一般的有(*(charArrayPoint+i))[1]等同于charArrayPoint[i][1]。因此,你的感觉是对的。
实际开发当中用定义p1,p2的方法就能替代数组指针的使用场景,那为何还要设计“数组指针”这个东东呢?纯粹用来增加学习难度的么T_T?
纯粹用来增加学习难度吗?当然不是。使用指向数组的指针,至少有以下好处:
1、强类型。比如,声明一个指向有5个char item的数组的指针,这里有个5,因此你不能拿这个指针指向有6,7,8个char item的数组。
2、简化使用指针时的语法。想象一下,如果要指向一个2维数组或3维数组或n维数组呢?还用char*,那多麻烦。
3、代码具有自解释性,更易阅读和理解。举例:
void f1(char (*arrpt)[6][6])
{
}
void f2(char *p)
{
}
因为charPointArray[0]是一个char类型的指针,以%s输出一个字符串时,只需指定一个char类型的指针(此指针的值正是所需要的、字符串的首地址)。如若写成*charPointArray[0],则是输出一个字符了,当然不行。
②代码处,这句代码编译能通过,但运行时报错,为什么呢?
因为*(charPointArray[0])的值是字符C(ASCII为67),当以%s输出它时,会把67解释为字符串的首地址,因为指定了首地址,所以能通过编译。但到运行时,去取这个字符串时,OS会阻止程序去读取首地址为67的内存块,因为本程序无权访问这块内存,所以发生运行时错误。
③代码处,数组指针,本质虽然是一个指针,但是否真的有“数组的属性”呢?
对于指针p,C/C++有规定p[i]等同于*(p+i)。因为charArrayPoint也是一个指针,因此(*charArrayPoint)[1]等同于(*(charArrayPoint+0))[1]亦等同于charArrayPoint[0][1],更一般的有(*(charArrayPoint+i))[1]等同于charArrayPoint[i][1]。因此,你的感觉是对的。
实际开发当中用定义p1,p2的方法就能替代数组指针的使用场景,那为何还要设计“数组指针”这个东东呢?纯粹用来增加学习难度的么T_T?
纯粹用来增加学习难度吗?当然不是。使用指向数组的指针,至少有以下好处:
1、强类型。比如,声明一个指向有5个char item的数组的指针,这里有个5,因此你不能拿这个指针指向有6,7,8个char item的数组。
2、简化使用指针时的语法。想象一下,如果要指向一个2维数组或3维数组或n维数组呢?还用char*,那多麻烦。
3、代码具有自解释性,更易阅读和理解。举例:
void f1(char (*arrpt)[6][6])
{
}
void f2(char *p)
{
}
展开全部
a实现只代表这个数组的首地址,注意它是一个地址,int*
p,定义的一个指针,用来存放地址,所以是正确的,而且不管你数组有多大,都是正确的。
p,定义的一个指针,用来存放地址,所以是正确的,而且不管你数组有多大,都是正确的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你那个明显不对,语句末尾要以分号隔开
a的类型是int
[4],但你需要知道,在C中数组很常用,既然是常用的功能就应该被简化,p=a和p=&a效果是一样的,换做你你愿意用哪个?
a的类型是int
[4],但你需要知道,在C中数组很常用,既然是常用的功能就应该被简化,p=a和p=&a效果是一样的,换做你你愿意用哪个?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题是这样,a代表数组的首地址,是把内存中的一个地址赋给了指针*p,
比如int
a[1000];int
*p=a;这也是正确的
比如int
a[1000];int
*p=a;这也是正确的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个不是这个意思,你的*p=a;这个是把数组的首地址给p,注意是地址,不是一个数组
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询