C语言学习记录——二维数组指针

C语言学习记录——二维数组指针,第1张

二维数组指针
  • 数组指针和指针数组
  • 关于二维数组符号对应的意思
  • C 从函数返回数组

数组指针和指针数组

== [ ]的优先级高于* ==
举个例子

int a[2][3];
int (*p)[4] = a; 

此时p 是一个指针,指向的是int[4]类型的数组,p就是一个数组指针(存放数组地址的指针),而且是一个二维数组指针;

int a[2][3];
int *p[4] = a; 

此时 int *p[4]相当于int *(p[4]),变量是p[4],一个数组,此时是一个指针数组(指针类型的数组)

关于二维数组符号对应的意思
#include 
int main(){
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
    int (*p)[4] = a;
    printf("%d\n", sizeof(*p);
    return 0;

运行结果是16
说明有如下对应关系:
*p 代表的是 第0行全部的数据
*(p+1) 代表的是 第1行的全部数据
以此类推

但是*p + 1 代表的是 第0行第1元素的地址
*p单独使用时表示的是第 0 行数据,放在表达式中会被转换为第 0行数据的首地址,也就是第 0行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针



*(*p+1)才是 第0行第1元素的值

总结如下:

a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
C 从函数返回数组

C 语言不允许返回一个完整的数组作为函数的参数。


想要从函数返回一个一维数组,必须声明一个返回指针的函数;

int * myFunction()
{
.
.
.
}

另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。


/* 要生成和返回随机数的函数 */
int * getRandom( )
{
  static int  r[10];
  int i;

  /* 设置种子 */
  srand( (unsigned)time( NULL ) );
  for ( i = 0; i < 10; ++i)
  {
     r[i] = rand();
     printf( "r[%d] = %d\n", i, r[i]);

  }

  return r;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/634776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-16
下一篇 2022-04-16

发表评论

登录后才能评论

评论列表(0条)

保存