一些函数、指针、const、结构体、extern零散整理

1、啥时候用指针作为函数名,函数参数?

(1)做函数名的时候把他作为函数指针,格式:type (*p)(type,type),从格式来看(*p)是函数名,括号要加的,括号的优先级大于*

定义函数指针:int (*p)(int,int) = max    //max也是一个函数,int max(int ,int)

因为函数也可以看作是一大堆连续数据的集合,函数名也会被看作这堆数据的首地址,所以才可以用函数指针来指向其他函数;


(2) 当main( )函数当中的实参是数组,或者字符串的时候,这些实参因为是以数据集合存在的,量比较大,所以是不能一下子传递过来的,这时候就函数的形参就用指针来表示,把实参通过地址传递过去,用指针来遍历实参数组,字符串的地址--进而遍历他们内存上的数据;

#include<stdio.h>

int func(int a[])// 这里的a[]看着是数组,其实编译器都是不给他们分配内存的,最后都还是把他们转换成指针int *a的形式; 
{
    
}

int main()
{
    int a[] = {1,2,3,4,5,6}
    func(a);
    return 0;
}


2、结构体指针:int main1()
{
// 定义了一个结构体变量
// 结构体变量名和数组名进行区分
// 数组名代表数组首个元素的地址
// 结构体变量是一个变量不是地址
struct student stu; 

// 定义了一个结构体变量指针
struct student *p = &stu;

// 通过指针使用结构体变量:需要新的运算符->
// ->只是用在结构体指针变量引用成员变量的时候
p->id = 10;   // stu.id = 10;
strcpy(p->name, "abcd");

printf ("id = %d, name = %s\n", p->id, p->name);

return 0;
}


ps:将结构体变量a所占的内存空间赋值为0
memset (&a, 0, sizeof(struct A)); // 结构体变量的地址,从首地址开始,结构体A的长度  //也就是从首地址到sizeof((struct A))全部清零;


3、extern:

extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。


4、const修饰指针:(const会在编译的时候提醒你,你改变了自己不想改变的量,从而提高了程序的安全性)

const int * p;             // p可变,p指向的对象不可变
int const * p;             // p可变,p指向的对象不可变
int * const p;             // p不可变,p指向的对象可变
const int * const p;       // 指针p和p指向的对象都不可变
 
这里给出一个记忆和理解的方法:
先忽略类型名(编译器解析的时候也是忽略类型名),我们看const离哪个近,“近水楼台先得月”,离谁近就修饰谁。
const (int) *p   //const 修饰*p,p是指针,*p是指针指向的对象,不可变。
(int) const * p; //const 修饰*p,p是指针,*p是指针指向的对象,不可变。
( int) * const p;//const 修饰p,p不可变,p指向的对象可变
const ( int)* const p;  // 前一个const修饰*p,后一个const修饰p,指针p和p指向的对象都不可变

看例子:

#include<stdio.h>

//先说一个基础的const 修饰整形;
#if 0
int main1()
{
    int const a = 20;
    //a = 10        //编译会出错!提示你在修改一个只读变量!
    int *p = &a;    //以下两行是流氓方法 =_=!
    *p = 10;
    printf("%d\n",a);//按理来说变量a的值不能变,可是输出的结果是10;这里指针是流氓的,把只读的数据改了值

    return 0;
}
#endif

//下面是const 修饰指针
int main()
{
    int a = 10;
    int const *p = &a;//const 修饰*p
    p ++;
   // *p = 20;  //因为这里是*p不可变,所以编译会出错;

    int * const p1 = &a;//const 修饰p1;
    *p1 = 20; 
   // p1 ++;    //因为这里是p1 不可变,所以编译报错;
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值