C多维数组指针相关

马哥哞哞 2018-03-06 10:45:13
为啥
int str[3][10],*p;
p= str;
是错误的?

而int str[3][10],*p;
p= str[1];
是正确的?

str不等于str[0]吗?已经验证值是相同的,所以是类型不同吗?求深剖!
...全文
401 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
冲tm的 2018-03-07
  • 打赏
  • 举报
回复
引用 2 楼 INNATEKING的回复:
一维数组的数组名是首地址,二维数组名指向二维数组的第一行,二维数组名[0]指向二维数组第一行的第一个元素,二维数组名+0指向二维数组的第二行,二维数组名[0]+1指向二维数组第二行的第一个元素,这个听起来有点烦,但是应该没错,二维数组分行地址,列地址,详细的你百度下吧,万一我有说错的,别笑话我啊
没错的。。。。。。。
赵4老师 2018-03-07
  • 打赏
  • 举报
回复
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
赵4老师 2018-03-07
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组
真相重于对错 2018-03-07
  • 打赏
  • 举报
回复
int a[3][3]; 如果要用指针来指向它 正确的语法是 int (*p)[3]=a; 意思是 p 是一个指针他指向了一个包含3个元素的数组
麻子来了 2018-03-07
  • 打赏
  • 举报
回复
建议看看这个,对c+多维数组深入解析:https://blog.csdn.net/sinat_22991367/article/details/76408197
  • 打赏
  • 举报
回复
Str指的是str[0][0] str[0]指的是数组第一行
真相重于对错 2018-03-07
  • 打赏
  • 举报
回复
引用 10 楼 qq_34994282 的回复:
#include<stdio.h> int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p); return 0; } 试了一下,,可以的啊,这个是对的,输出的是第一个元素
对,c的可以,c++不行
自信男孩 2018-03-07
  • 打赏
  • 举报
回复
类型不一样,虽然地址值一样的。 str是int (*)[10]; p是int *类型。
自信男孩 2018-03-07
  • 打赏
  • 举报
回复
引用 10 楼 qq_34994282 的回复:
#include<stdio.h> int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p); return 0; } 试了一下,,可以的啊,这个是对的,输出的是第一个元素
地址值一样,但是类型是不同的。 你用的编译器检查的不严格。另外,地址输出应该用%p或%u,而不是%d
冲tm的 2018-03-07
  • 打赏
  • 举报
回复
#include<stdio.h> int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p); return 0; } 试了一下,,可以的啊,这个是对的,输出的是第一个元素
srhouyu 2018-03-06
  • 打赏
  • 举报
回复
str的类型是int**,str[1]的类型是int*,str[1][1]的类型是int。所以结果很明显。
行走的哇牛 2018-03-06
  • 打赏
  • 举报
回复
一维数组的数组名是首地址,二维数组名指向二维数组的第一行,二维数组名[0]指向二维数组第一行的第一个元素,二维数组名+0指向二维数组的第二行,二维数组名[0]+1指向二维数组第二行的第一个元素,这个听起来有点烦,但是应该没错,二维数组分行地址,列地址,详细的你百度下吧,万一我有说错的,别笑话我啊
大米粥哥哥 2018-03-06
  • 打赏
  • 举报
回复
是类型不同 一个二维的 一个一维的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧