指针数组和指向数组的指针
- 指针数组是另外开辟内存空间存放数组,而指向数组的指针是一个数组的首地址的别名,所以可以通过
*(p+?)的形式获取其他数组元素 - 指针数组是一连串指针的总称,而指向指针的数组是一个指针
- 数组是存储一个固定大小的相同类型元素的顺序集合。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
-
声明数组
在 C 中要声明一个数组,需要
指定元素的类型和元素的数量,声明时并初始化可以省略元素数量 声明一维数组:
**type arrayName [ arraySize ];**arraysize>=0的整数常量- 声明多维数组:如
**int threedim[5][10][4];[?]数量任意** -
初始化数组
一维数组
可以逐个初始化
或者声明时初始化:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};获取数组长度
:sizeof(ArrayName)/sizeof(ArrayName[?])数组名也代表数组首地址,即a=&a[0]=&a
int *a=a[0]=*(&a[0]),所以sizeof(a)=sizeof(*a)=sizeof(a[0])=sizeof(&a[0])如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。
- (不知道为什么是整型指针,可能是任何类型的数组其地址都是整型吧)
- 形参为指向数组的指针:
**? myFunction(int *param){...}** - 形式参数是一个已定义大小的数组:
**? myFunction(int param[10]){...}** 形式参数是一个未定义大小的数组:
**? myFunction(int param[]){...}**```c double getAverage(int arr[], int size) { int i; double avg;//平均值 double sum;//数组总和for (i = 0; i < size; ++i) { sum += arr[i]; }
avg = sum / size;
return avg; }
include
/ 函数声明 / double getAverage(int arr[], int size);
int main () { / 带有 5 个元素的整型数组 / int balance[5] = {1000, 2, 3, 17, 50}; double avg;
/ 传递一个指向数组的指针作为参数 / avg = getAverage( balance, 5 ) ;
/ 输出返回值 / printf( “平均值是: %f “, avg );
return 0; }
结果:平均值是214.400000
有一个坑,改为第二种形式,此时可以正确输出214.如果进一步将5改为sizeof(a)/sizeof(a[0])的形式就输出不了正确的结果,比如515,204...<a name="IX9mm"></a>## 从函数返回数组**C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针**- **从函数返回一个一维数组,你必须声明一个返回指针的函数**`**int* myFunction(){...}**````c#include <stdio.h>返回一个int型指针,return则返回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;}/* 要调用上面定义函数的主函数 */int main (){/* 一个指向整数的指针 */int *p;int i;p = getRandom();for ( i = 0; i < 10; i++ ){printf( "*(p + %d) : %d\n", i, *(p + i));}return 0;}
- 函数是返回一个int型指针,return语句返回的是数组首地址(即数组名) 这里必须是int,因为是地址
- 主函数内再定义一个int型指针接收函数返回的数组首地址。然后通过
***(p+数字)**表示下标来访问数组元素 - C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。所以如果是在函数内定义的数组,记得设置为static类型
