指针数组课后作业,萌新求教
#include <stdio.h>#include <string.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; j < 5; j++)
{
if (i > strlen((*p)) - 1) //这一步操作是干什么的?能否解释下为何该程序少了这段代码会出现%?
{
break;
}
printf("%c ", (*p));
}
printf("\n");
}
return 0;
}
本帖最后由 桃花飞舞 于 2022-11-21 00:15 编辑
看不看得懂就看你的了,我也只能表达成这样,
如果不借用编译器的结果,我自己是得不出结果的。
#include <stdio.h>
#include <string.h>
int main()
{
char *array = {"FishC", "Five", "Star", "Good", "Wow"}; //指针数组,每个元素都是指针,字符串存储在常量区
char *(*p) = &array; //这是一个二级指针,(*p)是数组类型的指针
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("i = %dlen = %d\n",i,strlen((*p)));
//这一步操作是干什么的?能否解释下为何该程序少了这段代码会出现%?
if (i > strlen((*p)) - 1) //strlen((*p))是指的是指针数组每个元素的长度,也就是每个元素中字符的个数,
//i指的是指针数组char *array中每个元素指向的字符串的第i个字符
//如果i大于指针数组中指针指向的字符串的字符串总长度,就不打印当前到后面的行的第i列的字符,
//也就是说第j行的第i列没有字符。再从指针数组的第一个元素(指针)指向的字符串也就是j = 0开始
{
break;
}
printf("%c ", (*p)); //j指的是行,i指的是列
}
printf("\n");
}
return 0;
}
本帖最后由 竹逸 于 2022-11-21 15:27 编辑
求大佬帮我讲解下,我下面的代码为什么是错的{:5_104:}
我的理解是:p是一个数组指针,该数组的各个元素是字符型指针,array赋值给p,那p就指向了数组array
p+i:指的是下标为i的元素的地址
那 *(p+i) 就是取下标为 i 元素的值,也就是一个字符型指针,指向了字符串的首地址
那*(*(p+i)+j) 取的就是 i 字符串中下标为 j 的字符
#include<stdio.h>
void main()
{
char *array = {"FishC", "Five", "Star", "Good", "Wow"};
char *(*p) = array;
int i, j;
#if(1)
for(i=0; i<5 ; i++)
{
for(j=0 ; j<strlen(*(p+i)) ; j++)
{
putchar(*(*(p+i)+j));
}
putchar('\n');
}
#endif
#if(0)
for(j=0 ; j<5 ; j++)
{
if(strlen(*(p+j)))
{
printf("%s",*(p+j));
}
putchar('\n');
}
#endif
}
@jackz007 @人造人
本帖最后由 jackz007 于 2022-11-21 18:18 编辑
竹逸 发表于 2022-11-21 14:05
求大佬帮我讲解下,我下面的代码为什么是错的
我的理解是:p是一个数组指针,该数组的各个元 ...
#include <stdio.h>
#include <string.h>
int main()
{
const char * array = {"FishC", "Five", "Star", "Good", "Wow"} ; // array 为有 5 个元素的指针数组,就是说,数组元素是指针
// array = "FishC"
// array = "Five"
// array = "Star"
// array = "Good"
// array = "Wow"
const char * (* p) = & array ; // p 为指向 (*) 末维为 5 的二维指针数组的指针,也就是说,p 是一个三级指针,p 加减 1 的跨度
// 是 5 个指针元素,从 p 到 char 需要经过 3 次降级,就是说 p 前面必须出现 3 个 *。
// ** p = p = "FishC"
// * (* p + 1)= p = "Five"
// * (* p + 2)= p = "Star"
// * (* p + 3)= p = "Good"
// * (* p + 4)= p = "Wow"
int i , j ;
for(i = 0 ; i < 5 ; i ++)
{
for(j = 0 ; j < strlen(* (* p + i)) ; j ++)
{
putchar(*(*(* p + i) + j)) ;
}
putchar('\n') ;
}
for(j = 0 ; j < 5 ; j ++)
{
if(strlen(* (* p + j)))
{
printf("%s" , * (* p + j)) ;
}
putchar('\n') ;
}
} jackz007 发表于 2022-11-21 16:40
完了,我理解的p是个二级指针,敢明儿我重新复习下数组指针的内容{:10_247:} jackz007 发表于 2022-11-21 16:40
我认真思考了一下,原来我是把array这个数组名当成了整个数组的地址了,它应该是array中第0个元素的地址,&array才是整个数组的地址,然后*p又展开为第0个元素的地址了,怪不得我会把p看成二级指针{:10_266:}搞浑了{:10_247:} 竹逸 发表于 2022-11-21 23:53
我认真思考了一下,原来我是把array这个数组名当成了整个数组的地址了,它应该是array中第0个元素的地址 ...
p = & array 并不是说& array才是整个数组的地址,而是因为 array 本身只是一个二级指针,& array 才是一个三级指针,才能和 p 的三级指针属性对等; jackz007 发表于 2022-11-22 00:46
p = & array 并不是说& array才是整个数组的地址,而是因为 array 本身只是一个二级指针, ...
char *(*p)和char ***p是不是没有区别?
这里的 5 是不是表明p指向的array数组中有5个元素?
百度了一下,多级指针还可以这样声明,旧版本的课件里就没有这样的内容{:10_266:} 竹逸 发表于 2022-11-22 07:04
char *(*p)和char ***p是不是没有区别?
这里的 5 是不是表明p指向的array数组中有5个元素?
代码是现成的,是不是一样你自己一试不就知道了。 jackz007 发表于 2022-11-22 08:37
代码是现成的,是不是一样你自己一试不就知道了。
嗯,晚上下班了回去试试{:10_279:} 竹逸 发表于 2022-11-21 14:05
求大佬帮我讲解下,我下面的代码为什么是错的
我的理解是:p是一个数组指针,该数组的各个元 ...
p+i:指的是下标为i的元素的地址
错
sh-5.1$ cat main.c
#include <stdio.h>
int main(void) {
int i = 123;
int *pi = &i;
printf("%p\n", &i);
printf("%p\n", pi);
printf("%p\n", pi + 1);
printf("%p\n", pi + 2);
printf("%p\n", pi + 3);
return 0;
}
sh-5.1$ ./main
0x7fffc894ea40
0x7fffc894ea40
0x7fffc894ea44
0x7fffc894ea48
0x7fffc894ea4c
sh-5.1$
pi是一个指针,指向int类型,pi + 1 就是指向下一个int的位置
sh-5.1$ cat main.c
#include <stdio.h>
int main(void) {
int a = {1, 2, 3, 4, 5};
int (*pa) = &a;
printf("%p\n", &a);
printf("%p\n", pa);
printf("%p\n", pa + 1);
printf("%p\n", pa + 2);
printf("%p\n", pa + 3);
return 0;
}
sh-5.1$ ./main
0x7ffdde5e1e40
0x7ffdde5e1e40
0x7ffdde5e1e54
0x7ffdde5e1e68
0x7ffdde5e1e7c
sh-5.1$
pa是一个指针,指向数组类型,pa + 1 就是指向下一个数组的位置
页:
[1]