C语言中的复合类型
复合类型
一、掌握的类型
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语言中的复合类型的更多相关文章
- c语言中自定义bool类型模板
首先,c语言中没有bool类型,只有c++中有,所以需要自定义,即c中表示bool类型的方法: 1.模板1 typedef int bool; #define false 0 #define true ...
- c++中的复合类型
复合类型是指基于其他类型而定义的类型. 而这里介绍的是引用和指针.并且指针和引用都提供了对其他对象的间接访问. 引用 引用还是很好理解的,就是为对象起了另外一个名字,引用类型引用另外一种类型. 通常将 ...
- go语言基础之复合类型
1.分类 类型 名称 长度 默认值 说明 pointer 指针 nil array 数组 0 slice 切片 nil 引⽤类型 map 字典 nil 引⽤类型 struct 结构体 2.指针 指针是 ...
- 关于c++中的复合类型
目录 数组 字符串 结构体 共用体 枚举 指针 数和指针的关系 常见的存储方式 数组替代品 一.数组 存储在每个元素中值的类型 数组名 数组中的元素数 通用格式:typename arrayname ...
- 简答的理解C语言中的各种类型函数
1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...
- C语言中几种类型所占字节数
其实C标准并没有具体给出规定哪个基本类型应该是多少个字节数,而且这个也与OS.编译器有关,比如同样是在32位操作系统,VC++的编译器下int类型为4个字节,而在tuborC下则是2个字节. 下面给出 ...
- 浅析C语言中的整形类型
在C语言中,可以把 字符型.短整形.整形.长整形都看作是整形,同属于整形家族这个大类型. 这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下. 一 类型存储字节长度说明 ...
- 输出C语言中 变量的类型
使用gcc的警告信息间接知道变量的类型 #include <stdio.h> #include <stdlib.h> #include <stddef.h> #in ...
- Go语言中的值类型和引用类型
一.值类型和引用类型值类型:int.float.bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中.当使用等号=将一个变量的值赋给另一个变 ...
随机推荐
- 【Swift学习】Swift编程之旅---构造方法(十八)
初始化是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包括为每个存储的属性设置一个初始值,然后执行新实例所需的任何其他设置或初始化. 初始化是通过定义构造器(Initialize ...
- jquery Ajax异步请求之session
写了一个脚本,如下: $(function () { $("#btnVcode").click(function () { var receiveMobile = $(" ...
- LINQ多个操作嵌套实现
获取集合,需要使用多个条件Where,排序OrderBy,查询Select一起. 先来分步实现: source code: string[] stringArray = { "hgdgh&q ...
- DevExpress的XtraReport和微软RDLC报表的使用和对比
我们开发程序的时候,经常会碰到一些报表,如果是Winform的报表,一般可以采用DevExpress控件组的XtraReport,或者微软的RDLC报表,当然还有一些其他的,在此不再赘述.由于本人在W ...
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
示例准备 打开上一篇文章配置好的AD域控制器 开始菜单-->管理工具-->Active Directory 用户和计算机 新建组织单位和用户 新建层次关系如下: 知识了解 我们要用C# ...
- 火狐浏览器+Firebug+FirePath测试Xpath
前言 抓取网页数据时使用HtmlAgilityPack分析,需要通过xpath定位页面元素.如果有个xpath的生成和验证工具就事半功倍了,火狐浏览器插件FirePath配合Firebug就能完美实现 ...
- ASP.NET三层架构之不确定查询参数个数的查询
在做三层架构的时候,特别是对表做查询的时候,有时候并不确定查询条件的个数,比如查询学生表:有可能只输入学号,或者姓名,或者性别,总之查询条件的参数个数并不确定,下面是我用List实现传值的代码: 附图 ...
- Java的堆(Heap)和栈(Stack)的区别
Java中的堆(Heap)是一个运行时数据区,用来存放类的对象:栈(Stack)主要存放基本的数据类型(int.char.double等8种基本数据类型)和对象句柄. 例1 int a=5; int ...
- MacOS下如何进行Git的冲突(Conflict)处理
Git在做merge时经常碰到冲突的问题,多数情况都是用IDE中集成的"解决冲突"工具解决了,但有时不能依赖IDE时,就得回过头来去搞清楚Git的一些基础操作了. mergetoo ...
- Redis配置集群二(window)
第一篇那redis的基础命令都差不多讲了一遍了,这篇就将怎么配置集群了,最后要达到的效果是一台主redis,还有几台从的redis,每次数据都是同步的,当主redis挂掉了,那么就会从几台从redis ...