C语言 指针函数 行指针 列指针

liuchang910781261 2015-01-26 03:29:39
大恨:小弟在VC6.0上写的程序,粘贴在这里格式都是左对齐了,哎~~~
小弟最近一直对行指针和列指针理解有些吃力,下面这个程序是书本上的,小弟对其中有些部分理解不好,恳请大神不惜赐教~~~

#include<stdio.h>
float *search(float (*p)[4])//该函数的返回值是一个指向float类型的指针,这里的形参p是一个行指针
{
int i;
float *pt;
pt=*(p+1);//p是一个行指针,p+1当然也是行指针,那么*(p+1)则是一个列指针
for(i=0;i<4;i++)
{
if(*(*p+i)<60)//*p+i表示第0行第i列指针,*(*p+i)表示第0行第0列的元素
{
pt=*p;//如果该行中某个元素的值小于60,那么返回该行的第一个元素的指针,也就是返回一个列指针
}
}
return pt;//如果没有,那么返回p所指向的下一行首元素的指针,当然也是列指针
}

void main()
{
float score[][4]={70,52,68,89,88,74,85,96,64,55,53,78};//我可以认为score数组是1行12列吗(因为这样的话,我可以通过1个列指针访问数组的所有元素)?这样理解正确吗?
float *ptr;
int i,j;
for(i=0;i<3;i++)
{
ptr=search(score+i);//search函数的形参是一个行指针,返回值也是一个列指针,那么ptr也是一个列指针
if(ptr==*(score+i)) //如果两者相等,则说明score数组中某元素的值<60
{ //如上所述:如果我可以把score数组看成1行12列,那么请问这里的ptr是将跟score数组中每个元素的值相比较,是应该这样理解吗?
printf("No.%d score: ",i+1);
for(j=0;j<4;j++)
{
printf("%5.2f ",*(ptr+j));//ptr是一个列指针,那么ptr+j表示该行第j个元素的地址
} //*(ptr+j)则表示该行第j个元素的值
printf("\n");
}
}
}
...全文
353 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuchang910781261 2015-01-27
  • 打赏
  • 举报
回复
引用 8 楼 qq_25621905 的回复:
我觉得你对这段代码的理解不正确,说说我自己的看法,不一定对,不对的地方请指正,我也是刚学: #include<stdio.h> float *search(float (*p)[4])//该函数的返回值是一个指向float类型的指针,这里的形参p是一个行指针这里的*p是指向一维数组的指针变量,所以说没有你下面所说的行与列的关系 { int i; float *pt; pt=*(p+1);//p是一个行指针,p+1当然也是行指针,那么*(p+1)则是一个列指针这里看不懂是什么意思,求高手指点,为什么要把pt的初值赋为*(p+1) for(i=0;i<4;i++) { if(*(*p+i)<60)//*p+i表示第0行第i列指针,*(*p+i)表示第0行第0列的元素这里的意思是这个数组的四个地址依次取值看是不是小于60,成立则执行pt=*p { pt=*p;//如果该行中某个元素的值小于60,那么返回该行的第一个元素的指针,也就是返回一个列指针 } } return pt;//如果没有,那么返回p所指向的下一行首元素的指针,当然也是列指针 } ]
小弟也是初学,程序是书本上的例子,注释是小弟自己加的,问题肯定很多,请大家指正~~~
赵4老师 2015-01-27
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
赵4老师 2015-01-27
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
纹枰老妖 2015-01-26
  • 打赏
  • 举报
回复
#include<stdio.h>
float *search(float (*p)[4])//该函数的返回值是一个指向float类型的指针,这里的形参p是一个行指针
{                                            
int i;
float *pt;
pt=*(p+1);//p是一个行指针,p+1当然也是行指针,那么*(p+1)则是一个列指针
for(i=0;i<4;i++)
{
if(*(*p+i)<60)//*p+i表示第0行第i列指针,*(*p+i)表示第0行第0列的元素
{
pt=*p;//如果该行中某个元素的值小于60,那么返回该行的第一个元素的指针,也就是返回一个列指针
}
}
return pt;//如果没有,那么返回p所指向的下一行首元素的指针,当然也是列指针
}

void main()
{
float score[][4]={70,52,68,89,88,74,85,96,64,55,53,78};//我可以认为score数组是1行12列吗(因为这样的话,我可以通过1个列指针访问数组的所有元素)?这样理解正确吗?
float *ptr;                                            
int i,j;
for(i=0;i<3;i++)
{
ptr=search(score+i);//search函数的形参是一个行指针,返回值也是一个列指针,那么ptr也是一个列指针
if(ptr==*(score+i)) //如果两者相等,则说明score数组中某元素的值<60
{                   //如上所述:如果我可以把score数组看成1行12列,那么请问这里的ptr是将跟score数组中每个元素的值相比较,是应该这样理解吗?
printf("No.%d score: ",i+1);
for(j=0;j<4;j++)
{
printf("%5.2f ",*(ptr+j));//ptr是一个列指针,那么ptr+j表示该行第j个元素的地址
}                             //*(ptr+j)则表示该行第j个元素的值
printf("\n");
}
}
}
qq_25621905 2015-01-26
  • 打赏
  • 举报
回复
我觉得你对这段代码的理解不正确,说说我自己的看法,不一定对,不对的地方请指正,我也是刚学: #include<stdio.h> float *search(float (*p)[4])//该函数的返回值是一个指向float类型的指针,这里的形参p是一个行指针这里的*p是指向一维数组的指针变量,所以说没有你下面所说的行与列的关系 { int i; float *pt; pt=*(p+1);//p是一个行指针,p+1当然也是行指针,那么*(p+1)则是一个列指针这里看不懂是什么意思,求高手指点,为什么要把pt的初值赋为*(p+1) for(i=0;i<4;i++) { if(*(*p+i)<60)//*p+i表示第0行第i列指针,*(*p+i)表示第0行第0列的元素这里的意思是这个数组的四个地址依次取值看是不是小于60,成立则执行pt=*p { pt=*p;//如果该行中某个元素的值小于60,那么返回该行的第一个元素的指针,也就是返回一个列指针 } } return pt;//如果没有,那么返回p所指向的下一行首元素的指针,当然也是列指针 } ]
liuchang910781261 2015-01-26
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
感谢大神细心指教!
707wk 2015-01-26
  • 打赏
  • 举报
回复

001.c: In function ‘main’:
001.c:18:2: warning: missing braces around initializer [-Wmissing-braces]
  float score[][4] = { 70, 52, 68, 89, 88, 74, 85, 96, 64, 55, 53, 78 };
  ^
001.c:18:2: warning: (near initialization for ‘score[0]’) [-Wmissing-braces]
编译成功结束。
707wk 2015-01-26
  • 打赏
  • 举报
回复
indent: 001.c:6: 警告:旧式赋值“=*”有歧义。假定为“= *”

indent: 001.c:11: 警告:旧式赋值“=*”有歧义。假定为“= *”
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
赵4老师 2015-01-26
  • 打赏
  • 举报
回复
仅供参考
//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]
假正经的班长 2015-01-26
  • 打赏
  • 举报
回复
引用 1 楼 cjqpker 的回复:
什么行指针、列指针的,我觉得这么多反而会让人更加糊涂。 如果有需求需要使用行、列的概念,比如 #define ROW 100 #define COL 100 那你定义数组时,就可以定义成 float p[ROW * COL] 比如你要访问第15行第8个数字 就使用 p[ROW * 15 + 7] 本质上定义成 float p[ROW * COL] 和 float p[ROW][COL] 是一样的,内存中都是连续的 ROW * COL = 10000长度的空间,行和列的概念只是用以定位其中的某个位置而已,而且容易搞混了。
比如你要访问第15行第8个数字 应该是 p[ROW*14 + 7]
假正经的班长 2015-01-26
  • 打赏
  • 举报
回复
什么行指针、列指针的,我觉得这么多反而会让人更加糊涂。 如果有需求需要使用行、列的概念,比如 #define ROW 100 #define COL 100 那你定义数组时,就可以定义成 float p[ROW * COL] 比如你要访问第15行第8个数字 就使用 p[ROW * 15 + 7] 本质上定义成 float p[ROW * COL] 和 float p[ROW][COL] 是一样的,内存中都是连续的 ROW * COL = 10000长度的空间,行和列的概念只是用以定位其中的某个位置而已,而且容易搞混了。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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