- 数组指针和指针数组
- 关于二维数组符号对应的意思
- 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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)