C语言中的数组与指针

时间:2023-03-08 22:00:56

1、 数组的初始化

数组的初始化方法有很多,常用的方法有

定义时初始化 int arr[]={,,}; 或 int arr[]={}; //未初始化的元素全为0;

定义后遍历赋值初始化

         int arr[3];
for(int i=0;i<3;i++)
arr[i]=i;

  C99之后,出现了另一种十分方便的初始化方式。即利用元素位置来初始化该元素,使用方法如下 int arr[]={[]=,}

 

初始化后的结果 arr[]={,,,,}

此种方式的缺点是,后面的初始化后覆盖前面的初始化,即同一个初始化语句,最终的结果决定于靠后的语句。例如 arr[]={,,,,[]=); 最后的结果是  arr[]={,,,,}

2、数组作为函数参数

数组作为函数参数的用法,是将数组名作为参数传递。因为数组名是数组的首元素的地址,所以这种方式传递的实际上是指向数组首字母的指针。此时,使用指针和数组名作为参数功能等价。

在函数的声明部分,以下四种声明方式等价:

 int fun(int []);
int fun(int arr[]);
int fun(int *);
int fun(int *arr);

而在函数定义部分,由于不能省略参数,所以,上面的2,4两种方式等价。

因为数组作为函数参数传递的是指针,所以在函数中对数组做改变会影响到原数组的值,为避免这种情况(即在我们不希望函数对数组的值进行改变的时候),我们可以采用下面的函数定义方式

int fun(const int arr[]);

  用这种方是定义的函数会把指针定义为指向常量的指针,任何在函数内部试图对原数组的至进行改变的操作都会被编译器阻止。

3、其他一些指针小知识

指向常量的指针在上面的函数参数部分已经谈到了,即 const int *p; 定义了一个指向常量的指针,用这种方式定义的指针可以指向常量和普通变量,且不会改变指向对象的值。(普通指针不能指向常量 )

指针复制给指针时,有一点需要注意,虽然将普通指针赋值给常量指针是允许的,但这有一个前提,即只能进行一层间接运算,下面演示了如果允许两层间接运算带来的危险。

 const int n=;
int *p1;
const int * p2;
const int **p3;
p1=p2; //非法,将const指针赋值给普通指针
p2=p1; //合法,将普通指针赋值给const指针
p3=&p1; //非法,将const指针赋值给普通指针,如果假设允许,看下会发生什么
*p3=&n; //合法,const指针指向const,但p1指向n,即普通指针指向const值
*p1=; //合法,p1为普通指针,可以改变指向的变量值,后果是常量n的值改变

声明指向3个int值的指针的方法: int (*p)[]; (*的运算优先级低于[],所以如果不加()会声明为指针数组。)这时p相当于于 int arr[][]; 中的arr、&arr[1],指向了三个int型变量组成的数组。

相关文章