复合类型

一、掌握的类型

1. 指针数组

int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组

int a,b,c,d;

arr[0] = &a;

arr[1] = &b;

arr[2] = &c;

arr[3] = &d;

*arr[0] = 123; // a = 8;

2. 指向数组的指针

int (*p) [10];  //p是一个指针变量,指向一个有10个整形元素的数组

int arr[10] = {12,32,34,43,45};

int (*p) [10] = &arr;

p = arr; //会弹出类型不匹配的警告信息,因为,数组名就是数组的首地址,&arr也是arr数组的地址,是相等的

(*p)[0] = 123;

printf("%d\n", arr[0]);

需要注意的,p+1是从数组的首地址开始加40个字节。

p是一个指针变量,长度为8

*p指向一个长度为10的整形数组,长度为40

p的类型为 int(*)[10]

3. 指向指针的指针

int * * p;

*p是一个指针,指向int *类型,即p是一个指向指针的指针

void changePointer( int **q){ //q = &p

*q = NULL;

}

int a ;

int *p = &a;

changePointer( &p); //可以修改p指针变量的指向

二、二维数组传参

数组名就是数组首元素的地址

void func( int (*p)[5] ){

p[0][0] = 123;

}

int arr[4][5] = {};

func(arr);      // arr == &arr[0],arr[0]是一个长度为5的数组,函数需要一个指向5个元素数组的指针变量作为形参

printf("%d\n", arr[0][0]);

作业:

int ** p[10]; 作为参数传递形参应该怎么接收?

int x[3][4];  形参如何接收

三、了解的复合类型

1. int * p(int); //声明一个函数p,有一个整形参数,返回一个指向整形数据的指针

2. int ( *func(int))[10];  //声明一个函数,返回一个指向数组的指针,函数的返回值就是盖住函数调用部分,其他的就是函数的返回值。

int ( * fun (int x )) [10] {

return NULL;

}

int (* ret) [10] = func(10);

ret = func(5);

3. int (*p) (int); //一个指向函数的指针

int add ( int x, int y){

return  x+y;

}

int multi( int x ,int y){

return  x * y;

}

int main(int argc, const char * argv[]) {

int (*p)(int, int ) = add; //p是一个指向函数的指针,定义的同时进行初始化

printf("%d\n",  p(3,4) ); //通过函数指针调用函数和直接使用函数名调用函数是一样的

p = multi; //函数名就是函数的入口地址,当程序编译后,函数就会保存到代码区,函数的地址就已经确定好了,

printf("%d\n", p(3,4));

return 0;

}

//例:函数入口地址

int testFunc( int n ){

printf( “func: %p\n”, testFunc);

printf(“ &n=%p\n”, &n);

if(n == 1 ) {

return 1;

}else{

return n & testFunc(n-1);

}

}

函数指针的作用:

1)将函数指针作为参数,可以提高代码的复用度

2)用于函数的回调

四、复合类型的确认

int ( *p[10] )[10];

//p是一个数组,有10个元素,p数组元素的类型是int(*)[10],int(*X)[10]这个类型也是一个指针,该指针指向一个含有10个整数的数组

int(*p[10])(int);

p是一个数组,有10个元素,每个元素又是一个指针,该指针指向有一个整形参数,返回整数的函数。

int *(*p)[10];

p是一个指针,这个指针指向一个数组,这个数组有10个元素,数组的每个元素又是一个指向int类型变量的指针

int (*(*func[10])(int))(int);

func是一个数组,每个元素是一个指针,int(*(X)(int))(int), 这是一个函数指针,int(*B)(int)这个函数指针返回一个函数指针。

C语言中的复合类型的更多相关文章

  1. c语言中自定义bool类型模板

    首先,c语言中没有bool类型,只有c++中有,所以需要自定义,即c中表示bool类型的方法: 1.模板1 typedef int bool; #define false 0 #define true ...

  2. c++中的复合类型

    复合类型是指基于其他类型而定义的类型. 而这里介绍的是引用和指针.并且指针和引用都提供了对其他对象的间接访问. 引用 引用还是很好理解的,就是为对象起了另外一个名字,引用类型引用另外一种类型. 通常将 ...

  3. go语言基础之复合类型

    1.分类 类型 名称 长度 默认值 说明 pointer 指针 nil array 数组 0 slice 切片 nil 引⽤类型 map 字典 nil 引⽤类型 struct 结构体 2.指针 指针是 ...

  4. 关于c++中的复合类型

    目录 数组 字符串 结构体 共用体 枚举 指针 数和指针的关系 常见的存储方式 数组替代品 一.数组 存储在每个元素中值的类型 数组名 数组中的元素数 通用格式:typename arrayname ...

  5. 简答的理解C语言中的各种类型函数

    1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...

  6. C语言中几种类型所占字节数

    其实C标准并没有具体给出规定哪个基本类型应该是多少个字节数,而且这个也与OS.编译器有关,比如同样是在32位操作系统,VC++的编译器下int类型为4个字节,而在tuborC下则是2个字节. 下面给出 ...

  7. 浅析C语言中的整形类型

    在C语言中,可以把 字符型.短整形.整形.长整形都看作是整形,同属于整形家族这个大类型. 这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下.   一 类型存储字节长度说明 ...

  8. 输出C语言中 变量的类型

    使用gcc的警告信息间接知道变量的类型 #include <stdio.h> #include <stdlib.h> #include <stddef.h> #in ...

  9. Go语言中的值类型和引用类型

    一.值类型和引用类型值类型:int.float.bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中.当使用等号=将一个变量的值赋给另一个变 ...

随机推荐

  1. Swift 2.2发布

    Swift 2.2 发布了.支持linux平台.Swift是一种使用现代的安全设计方式和软件设计模式构建的通用编程语言.该版本语言更新如下: SE-0001: Allow (most) keyword ...

  2. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 场景模拟 假设由于漏存JD SKU对应的店铺信息.这时我们需要重新完全采集所有 ...

  3. The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

    刚刚有在程序中,传递一个空值至MS SQL Server数据库,这个值的数据类型为DATETIME执行时,它却发生了如标题提示的异常:The conversion of a varchar data ...

  4. CIO:让IT成为企业的一种竞争优势

    在你的公司,IT是将自己视为服务提供者,业务部门的合作伙伴,还是创新驱动者?其他部门的领导者是怎么看待IT的?在老板的眼里,IT是如何的一个定位?在过去一年的,身为企业的CIO,你是否知道哪些应用或新 ...

  5. 一篇文看懂Hadoop:风雨十年,未来何去何从

    本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...

  6. Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. The ...

  7. C#中WinForm窗体事件的执行次序

    C#中WinForm窗体事件的执行次序如下: 当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件:        System.Windows.Forms.Control ...

  8. 不可或缺 Windows Native (23) - C++: 虚函数

    [源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...

  9. WITH RECURSIVE and MySQL

    WITH RECURSIVE and MySQL If you have been using certain DBMSs, or reading recent versions of the SQL ...

  10. Python中的编码

    http://liguangming.com/how-to-use-utf-8-with-python http://www.lijiejie.com/python-sys-setdefaultenc ...