乱读天书, 不求甚解
周祎骏的个人云笔记
Toggle navigation
乱读天书, 不求甚解
主页
Linux:系统配置
Linux:用户管理
Linux:优化排错
Linux:进程调度
Linux:文件系统
Linux:网络
Linux:系统服务
Linux:安全
Linux:内核
容器:Docker
容器:containerd
容器编排:Kubernetes
IAC:Terraform
大数据:Hadoop
大数据:Zookeeper
大数据:Hbase
消息队列:rsyslog
消息队列:kafka
数据库:MySQL
数据库:MongoDB
搜索引擎:Elasticsearch
时序数据库:OpenTSDB
网站服务:Nginx
编程:Bash
编程:Perl
编程:Python
编程:C
编程:JAVA
编程:Rust
版本控制:gitlab
知识管理:docusaurus
常用小工具
关于我
标签
C 0.4 指针
2018-06-17 08:23:04
63
0
0
admin
> 指针,以及数组,函数中使用指针 #基础知识 ``` p = &x &运算符是取一个对象的地址,这样p就是指向x的指针 var = *y *运算符作用于指针的时候会获取指针所指向的对象 p = (int *) num num是一个表示地址的整数,把这个数字强制转化成一个指向int的地址 ``` * 指针也是一个变量,存放了一个内存地址。 如果是int 类型指针,那么系统就会用int 的格式去解析该指针所指向的地址 * 指针可以用于函数或者数组,且注意*运算符的优先级低于() * 指针通常用size_t(unsigned int 的typedef)来表示,但是intptr_t的可移植性更好。 一些例子: ``` char *a a是指向char的指针 char **a a是指向char的指针的指针 int *a[10] a一个10个元素组成的数组,每个元素是一个int指针 int (*a)[10] a一个指针 指向一个有10个int元素的数组 int *a() a一个返回一个int指针的函数 int (*a)() a一个指针 指向一个返回int的函数 ``` 多层指针的例子: ``` char *num[] = { "one","two","three","four"}; char **big[2]; char **small[2]; small[0] = &num[0]; small[1] = &num[1]; big[0] = &num[2]; big[1] = &num[3]; ``` *** #指针用于数组 * 数组是一个一系列相同元素在内存上连续的数据结构 * 当我们对指针做+n操作的时候,指针会按照当前指向的类型的大小向后移动n的整数倍,比如对于一个指向int 数组的指针,那么指针+1的操作在多数32位操作系统上就相当于是指针向后移动4个字节。 * 数组在很多时候都被视为指向首元素的指针。数组在作为函数的参数传递的时候会被化为指针,因此还需要传递给函数该数组的元素数量。 * 指针与指针间不能做加法,可以做减法,数组中常用。 例子1: ``` #include <stdio.h> main() { char lala[] = "12345"; printf("%c\n",lala[1]); printf("%c\n",*(lala+1)); } //两者结果一样 ``` 例子2: ``` #include <stdio.h> main() { char *lala = "abcde"; //实际lala是abcde第一个字符a的指针 while( *lala != '\0' ) { printf("%c\n",*lala++); } } ``` **需要注意*运算符优先级与++相同,系统从右往左运行** ``` #include <stdio.h> main() { int array[] = {1,11,111}; int *a = &array[0]; //a++; 相当于指针的地址+1,所以结果是11 (*a)++; =2 //相当于指针所指的变量+1,所以结果是2 } ``` ##多维数组/指针数组 多维数组: ``` int array[2][3] = { {1,2,3}, {4,5,6} }; ``` 指针数组(每一个元素是一个指向下一个维度的数组的指针) ``` char *abc[] = { "abcd","efg","hijk"}; ``` **指针数组与多维数组的区别** 因为指针数组只是一系列某种类型的指针组成的数组,这些指针所指的数组的长度不受限制,所以指针数组不强制低维的每一个数组的元素个数必须相同。 *** #指针用于函数 * main 函数会获得两个参数,argc(参数的数量),*argv(参数的内容),*argv是一个指向字符串数组的指针,argv[0]是启动该程序的程序名。 ``` #include <stdio.h> int main(int argc, char *argv[]) { char *first = "no"; char *second = "no"; if ( argc == 1 ) { printf("need arg\n"); return 1; } while ( *argv != '\0' ) { if ( (*argv)[0] == '-' ) { switch((*argv)[1]) { case 'f': first = "yes"; break; case 's': second = "yes"; break; } } argv++; } printf("first_arg=%s\n",first); printf("second_arg=%s\n",second); } ``` * 指针也分类型,表明指针所指向的数据类型,任何类型的指针都可以赋值给void类型的指针,且转换回来以后不丢失信息 该特性经常用于让函数可以兼容多种类型的参数。 ``` void function(void *a, void *b) ```
上一篇:
C 0.3 函数
下一篇:
C 0.5 结构
文档导航