关于指针函数,有个问题

时间:2022-03-25 18:50:28
 返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型

的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,

不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子: 
  #include 
  float *find(); 

  main() 
  { 
  static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}}; 
  float *p; 
  int i,m; 
  printf("Enter the number to be found:"); 
  scanf("%d",&m); 
  printf("the score of NO.%d are:\n",m); 
  p=find(score,m); 
  for(i=0;i<4;i++) 
  printf("%5.2f\t",*(p+i)); 
  } 

  float *find(float(*pionter)[4],int n)/*定义指针函数*/ 
  { 
  float *pt; 
  pt=*(pionter+n); 
  return(pt); 
  } 

pt=*(pionter+n); 这句,pt应该是一个数字,不是地址。那么find返回的是数字了?

请问这个小程序 到底什么意思? 是不是pt=*(pionter+n);这句写错了?应该去掉 *()吧?

18 个解决方案

#1


没错。
float(*pionter)[4]
pionter是指针数组,*(pionter+n)为指针

#2


float (*pointer)[4]是个行指针,*(pointer + n) 指向二维数组的第n行

#3


例子没错。
float (*pointer)[4];
由于一对圆括号的存在,*先与pointer结合,说明pointer是一个指针变量,
再与说明符【】结合,说明pointer的基类型是一个包含有4个int元素的数组。
即pointer为行指针,所以pointer+n指向第n+1行,*(pointer+n)是第n+1行
的首地址。

#4


pt=*(pionter+n);//(pionter+n)指向的还是地址
他在piontier数组里存的是指针而不是一般的数字字符之类

#5


float(*pionter)[4];
pionter声明的是一个指针,这个指针指向一个有四个float元素的数组。
pionter+n
pionter每加1就代表跳过一个含四个float元素的数组的地址空间,也就是4*4=16,
并指向这个有四个float元素的数组。
*对它进行解引用,它就指向了数组的元素,也就是float *

#6


没有错,各位大侠解释的挺好!!
顶一个!!

#7


这个指针指向的类型是:
包含4个float元素的一维数组

学习了

#8


程序的最终功能是什么? 还是匪夷所思,我去看看指针数组

#9


引用 1 楼 ouyh12345 的回复:
没错。 
float(*pionter)[4] 
pionter是指针数组,*(pionter+n)为指针


float(*pionter)[4]???这个是数组指针吧?

#10


引用 9 楼 delacroix_xu 的回复:
引用 1 楼 ouyh12345 的回复:
没错。
float(*pionter)[4]
pionter是指针数组,*(pionter+n)为指针


float(*pionter)[4]???这个是数组指针吧?

实际就是一个二维的数组,一个指针实际就是一个32位的整型
最好理解为指针的一维数组

#11


p=find(score,m);

我主要是想知道传参数 float(*pionter)[4]=score之后发生了什么?
初始化一个 数组指针float (*pionter)[4],而pointer=什么? *pointer=什么??

pt=*(pointer+n), p=pt , 最后打印出 *(p+i),于是相当于输出*((*(pointer+n))+i)对吗?

注释: pionter就是pointer 原文单词拼写错误

#12


莫非是:传入参数后 pointer指向 首个元素的地址,而不是指向首个元素;*pointer才指向首个元素,**pointer的值就是首个元素
这种说法对吗? 如果不对,他们前面说的就都不对了。

#13


引用 3 楼 geekblizzarddc 的回复:
例子没错。 
float (*pointer)[4]; 
由于一对圆括号的存在,*先与pointer结合,说明pointer是一个指针变量, 
再与说明符【】结合,说明pointer的基类型是一个包含有4个int元素的数组。 
即pointer为行指针,所以pointer+n指向第n+1行,*(pointer+n)是第n+1行 
的首地址。


但愿你 “*(pointer+n)是第n+1行的首地址。”这句话是对的。然后我发觉 数组指针这个东西把 二维数组(用横坐标和纵坐标访问) 变得可以 用 行数和 行内偏移(即列数)来用指针表示。这有什么意义吗?不是一样的吗?

#14


pointer就是整个二维数组的首地址,*pointer就是每个行的首地址,**pointer就是每行收个元素的值;前面几位都说的没错。

#15



#include <stdio.h>

void main()
{
int array[5];
int (*pa)[5]=&array; //注意前头那个&符号, 性质变了
}

#16


引用 10 楼 DarkChampion 的回复:
引用 9 楼 delacroix_xu 的回复:
引用 1 楼 ouyh12345 的回复: 
没错。 
float(*pionter)[4] 
pionter是指针数组,*(pionter+n)为指针 


float(*pionter)[4]???这个是数组指针吧? 


实际就是一个二维的数组,一个指针实际就是一个32位的整型 
最好理解为指针的一维数组
顶  我原以为是数组指针  其实“最好理解为指针的一维数组
” 受教!

#17


明白了,大家说的都是最重结果,但是没说这个最终结果是怎么来的

我来说说我的理解,传入参数的时候 float(*pointer)[4]= score; 这句话产生了如下影响

pointer存储了 地址的地址, *pointer 存储了地址, **pointer存储了数组的值;
pointer“每一跳” 内存地址递增 16字节, 因为每一行有四个数,每个数是int类型,占4个字节。

所以pointer+1就代表了 地址增16字节。。。。对吗?

#18


指针数组,数组元素就是指针

#1


没错。
float(*pionter)[4]
pionter是指针数组,*(pionter+n)为指针

#2


float (*pointer)[4]是个行指针,*(pointer + n) 指向二维数组的第n行

#3


例子没错。
float (*pointer)[4];
由于一对圆括号的存在,*先与pointer结合,说明pointer是一个指针变量,
再与说明符【】结合,说明pointer的基类型是一个包含有4个int元素的数组。
即pointer为行指针,所以pointer+n指向第n+1行,*(pointer+n)是第n+1行
的首地址。

#4


pt=*(pionter+n);//(pionter+n)指向的还是地址
他在piontier数组里存的是指针而不是一般的数字字符之类

#5


float(*pionter)[4];
pionter声明的是一个指针,这个指针指向一个有四个float元素的数组。
pionter+n
pionter每加1就代表跳过一个含四个float元素的数组的地址空间,也就是4*4=16,
并指向这个有四个float元素的数组。
*对它进行解引用,它就指向了数组的元素,也就是float *

#6


没有错,各位大侠解释的挺好!!
顶一个!!

#7


这个指针指向的类型是:
包含4个float元素的一维数组

学习了

#8


程序的最终功能是什么? 还是匪夷所思,我去看看指针数组

#9


引用 1 楼 ouyh12345 的回复:
没错。 
float(*pionter)[4] 
pionter是指针数组,*(pionter+n)为指针


float(*pionter)[4]???这个是数组指针吧?

#10


引用 9 楼 delacroix_xu 的回复:
引用 1 楼 ouyh12345 的回复:
没错。
float(*pionter)[4]
pionter是指针数组,*(pionter+n)为指针


float(*pionter)[4]???这个是数组指针吧?

实际就是一个二维的数组,一个指针实际就是一个32位的整型
最好理解为指针的一维数组

#11


p=find(score,m);

我主要是想知道传参数 float(*pionter)[4]=score之后发生了什么?
初始化一个 数组指针float (*pionter)[4],而pointer=什么? *pointer=什么??

pt=*(pointer+n), p=pt , 最后打印出 *(p+i),于是相当于输出*((*(pointer+n))+i)对吗?

注释: pionter就是pointer 原文单词拼写错误

#12


莫非是:传入参数后 pointer指向 首个元素的地址,而不是指向首个元素;*pointer才指向首个元素,**pointer的值就是首个元素
这种说法对吗? 如果不对,他们前面说的就都不对了。

#13


引用 3 楼 geekblizzarddc 的回复:
例子没错。 
float (*pointer)[4]; 
由于一对圆括号的存在,*先与pointer结合,说明pointer是一个指针变量, 
再与说明符【】结合,说明pointer的基类型是一个包含有4个int元素的数组。 
即pointer为行指针,所以pointer+n指向第n+1行,*(pointer+n)是第n+1行 
的首地址。


但愿你 “*(pointer+n)是第n+1行的首地址。”这句话是对的。然后我发觉 数组指针这个东西把 二维数组(用横坐标和纵坐标访问) 变得可以 用 行数和 行内偏移(即列数)来用指针表示。这有什么意义吗?不是一样的吗?

#14


pointer就是整个二维数组的首地址,*pointer就是每个行的首地址,**pointer就是每行收个元素的值;前面几位都说的没错。

#15



#include <stdio.h>

void main()
{
int array[5];
int (*pa)[5]=&array; //注意前头那个&符号, 性质变了
}

#16


引用 10 楼 DarkChampion 的回复:
引用 9 楼 delacroix_xu 的回复:
引用 1 楼 ouyh12345 的回复: 
没错。 
float(*pionter)[4] 
pionter是指针数组,*(pionter+n)为指针 


float(*pionter)[4]???这个是数组指针吧? 


实际就是一个二维的数组,一个指针实际就是一个32位的整型 
最好理解为指针的一维数组
顶  我原以为是数组指针  其实“最好理解为指针的一维数组
” 受教!

#17


明白了,大家说的都是最重结果,但是没说这个最终结果是怎么来的

我来说说我的理解,传入参数的时候 float(*pointer)[4]= score; 这句话产生了如下影响

pointer存储了 地址的地址, *pointer 存储了地址, **pointer存储了数组的值;
pointer“每一跳” 内存地址递增 16字节, 因为每一行有四个数,每个数是int类型,占4个字节。

所以pointer+1就代表了 地址增16字节。。。。对吗?

#18


指针数组,数组元素就是指针