您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-19 20:52 295 查看
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所占的内存空间赋值为0memset (&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;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息