数组指针‘’
请问:数组指针 指向的是指针类型数组,为什么不是最外面多加一个*取址符号呢
如
我的理解是:跟指向int型数组一样 --> *(*(p+i)+j)-->再取一次址
-->
如下:
*(*(*(p + i) + j))
而正确的是:
*(*(*p + i) + j)
这里为什么要先
*p 呢
有人嘛嘛,帮帮我{:5_104:}
完整程序如下:
#include <stdio.h>
int main()
{
char *array = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p) = &array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; *(*(*p + i) + j) != '\0'; j++)
{
printf("%c ", *(*(*p + i) + j));
}
printf("\n");
}
return 0;
} 助けてください
你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p 严凯 发表于 2020-12-14 14:50
你那里想错了吧,数组指针,实际上是指向数组类型的指针,既然是指针所以那里面应该是先*p
那为什么指向一般数组取值是
*(*(p+i)+j)呢{:5_104:}
而不是
*(*p+i)+j @风过无痕1989大佬在嘛{:5_104:}{:5_101:} 万千只cnm 发表于 2020-12-14 15:26
那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是
*(*p+i)+j,就意味着这个指针的值加j 本帖最后由 风过无痕1989 于 2020-12-14 16:20 编辑
万千只cnm 发表于 2020-12-14 15:28
@风过无痕1989大佬在嘛
对指针数组和数组指针的区别,示例代码如下所示:
int *array; // 定义一个指针数组
int (*arr); // 定义一个数组指针
首先,对于语句“int *array”,因为“[]”的优先级要比“*”要高,所以 array 先与“[]”结合,构成一个数组的定义,数组名为 array,而“int *”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,它是一个指针数组。
其次,对于语句“int(*arr)”,“()”的优先级比“[]”高,“*”号和 arr 构成一个指针的定义,指针变量名为 arr,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,arr 是一个指针,它指向一个包含 5 个 int 类型数据的数组,很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。
比较下面的例子,此例子与求助的程序输出结果完全相同,只是求助的程序,定义的是一个指针数组,而下面的程序定义的是一个数组指针,故而,求助的例子会多一个 * 号
#include <stdio.h>
int main()
{
char array = { "FishC", "Five", "Star", "Good", "WoW" };
char (*p) = array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; *(*(p + i) + j) != '\0'; j++)
{
printf("%c ", *(*(p + i) + j));
}
printf("\n");
}
return 0;
}
为了方便比较,我还是将上面的例子移下来:
#include <stdio.h>
int main()
{
char *array = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p) = &array;
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; *(*(*p + i) + j) != '\0'; j++)
{
printf("%c ", *(*(*p + i) + j));
}
printf("\n");
}
return 0;
}
风过无痕1989 发表于 2020-12-14 16:18
对指针数组和数组指针的区别,示例代码如下所示:
int *array; // 定义一个指针数组
谢谢这么用心{:5_104:}
那这里面最里面的(*p)有具体含义嘛
还是只是因为指向的是指针数组,单纯的加个* 万千只cnm 发表于 2020-12-14 21:44
谢谢这么用心
那这里面最里面的(*p)有具体含义嘛
还是只是因为指向的是指针数组,单纯的加 ...
不能说单纯地加个 *,是因为是那么定义的,它才有个 *。只要你别忘记 *array 定义的是一个指针数组,你就可以将它当作是一个数组的数组名看 风过无痕1989 发表于 2020-12-14 22:51
不能说单纯地加个 *,是因为是那么定义的,它才有个 *。只要你别忘记 *array 定义的是一个指针数组,你就 ...
请问那
char array = { "FishC", "Five", "Star", "Good", "WoW" };
char (*p) =&array;
为什么不是,不用加%取地址符号嘛
char (*p) = &array;
这样为什么也能打印出来呢但会提醒{:5_104:}
万千只cnm 发表于 2020-12-15 00:03
请问那
我的 VS2015 编译器输出不了,提示错误:
错误(活动) "char (*)" 类型的值不能用于初始化 "char (*)" 类型的实体
错误 C2440 “初始化”: 无法从“char (*)”转换为“char (*)” 万千只cnm 发表于 2020-12-14 15:26
那为什么指向一般数组取值是
*(*(p+i)+j)呢
而不是
一种是取行的值 一种是取列的值 怎么能一样
页:
[1]