1.数组名实际上是一个常量指针。
例如:int a[]; 中的 a 其实是 int *const a
但是:
int *const a = {3,4,5,6,7,3,7,4,4,6}; /*不行*/
int a[]={3,4,5,6,7,3,7,4,4,6}; /*可以,所以初始化数组时必定要这样。*/
2.const与指针
int const *p; p所指的值不能改变。
const int *p; p所指的值不能改变。
int *const p; p不能改变。
理解:
方式一:
const 后面是 *p,代表 *p 不能改变。
const 后面是 p,代表 p 不能改变。
方式二:
const 在 * 前,指针所指的值不能改变。
const 在 * 后,指针不能改变。
补充: 上述三种类型作为函数参数时,const的限制是在函数内部。
- int const *p:在函数内,副本*p不能改变,保护了调用处数组的元素值。
- int *const p:在函数内,副本 p不能改变,保护了函数内副本p的指向。
3.引用传递
- C 语言中函数参数的传递有:值传递、地址传递、引用传递
引用传递:
定义、声明函数时,参数中变量名前加一个 & 取地址符。
调用函数时,和值传递一样。
下方代码:
调用函数时,会将 a、b 代替 x、y ,我们称:x、y 分别引用了 a、b 变量。函数里操作的就是 a、b 本身了。也就是说函数里可以直接修改到 a、b 的值了。
#include<stdio.h>
void show(int &x,int &y); // 引用传递
int main(){
int a = 1;
int b = 2;
printf("a=%d,b=%d\n",a,b); // a=1,b=2
show(a,b); // x=2,y=1
printf("a=%d,b=%d\n",a,b); // a=2,b=1
return 0;
}
void show(int &x,int &y){
int temp = x;
x = y;
y = temp;
printf("x=%d,y=%d\n",x,y);
}
4.函数指针
- MyFun 函数名与 FunP 函数指针,都是函数指针。
- MyFun 函数名是一个函数指针常量,而 FunP 是一个函数指针变量。
void MyFun(int x);
void (*FunP)(int );
- 下面两组都是相互等价的(为了方便使用,C语言这样设计)。
FunP = &MyFun; // 两者等价
FunP = MyFun;
(*MyFun)(10); // 两者等价
MyFun(10);
5.函数指针作为参数
- typedef void (*FunType)(int );的意思是:把void (*FunType)(int )这一函数指针类型起名为FunType
#include<stdio.h>
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); //定义一个函数指针类型 FunType
void CallMyFun(FunType fp,int x);
int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10);
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
}
void CallMyFun(FunType fp,int x)
{
fp(x); // 传入一个FunType变量,并调用函数。
}
void MyFun1(int x) // 三个函数都符合FunType(参数都为一个int,返回值都为空)
{
printf("函数 MyFun1 中输出:%d\n",x);
}
void MyFun2(int x)
{
printf("函数 MyFun2 中输出:%d\n",x);
}
void MyFun3(int x)
{
printf("函数 MyFun3 中输出:%d\n",x);
}
本文详细解析了C语言中的指针概念,包括数组名作为指针、const与指针的关系、引用传递以及函数指针的应用。通过具体示例说明了如何在实践中正确运用这些特性。

551

被折叠的 条评论
为什么被折叠?



