《C语言学习笔记》指针数组及其应用
C语言中,最灵活但又容易出错的莫过于指针了。而指针数组,是在C中很常见的一个应用。指针数组的意思是说,这个数组存储的所有对象都为指针。除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样。
#include <stdion.h>
int main() {
int i;
char *name[] = {"BASIC", "FORTRAN", "C++", "Pascal", "COBOL"};
; i < (sizeof(name)/sizeof(char *)); i++)
printf("%s ", name[i]);
;
}
上面的代码中,定义了一个名为name的指针数组。它的数据类型为char *,表示其中存储的所有数据都为char指针,而name后面的[]则表示这是一个数组,并且未指定数组的大小。定义的同时,用{}内的内容初始化这个指针数组。而后,对指针数组的引用中,每个数组元素,都是一个指向字符串的指针。它们的对应关系如下图:

指针数组最常见的用法是在主函数,用以接收UNIX系统中由命令行传递的参数。记得大一学C语言时,当时什么指针数组,数组指针,完全就是不明就里。我记得,当时,也有讲到指针数组的命令行参数的应用。不过,在一个用Windows 系统下,用VC 6.0教学的环境下,都没谁来得及问下老师什么是命令行。因为不懂的实在太多了,不知从何问起了。不过想想也对,当时就算给我讲了什么是命令行,我也不一定能懂。
带命令行参数的C主函数原型:int main(int argc, char *argv[])。argc 参数会记录参数个数,而argv参数会具体记录所有参数,每一个参数都是以指针寻址的字符串,即指针数组中的每个元素都指向一个参数的地址。所以通过访问argv[1],可以获得目录名。在命令行参数的应用中,argv[0]指向当前命令名,argv[n]指向通过命令行传递进来的第n个参数。比如:UNIX中的ls命令的一个简单实现。
#include "apue.h"
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
)
err_quit("usage: ls directory_name");
])) == NULL)
err_sys(]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
exit();
}
这样的应用,在UNIX中,不知还有多少。一开始学习C语言时,完全是蒙的。不知其有何具体用处。而学了UNIX之后,就发现UNIX就是C的最佳实践。毕竟,C是作为写UNIX的工具而发明的。
《C语言学习笔记》指针数组及其应用的更多相关文章
- C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...
- C语言学习笔记 (004) - 数组名和数组首地址(转)
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...
- c语言学习笔记 - 指针和数组
结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...
- C语言学习笔记--指针和数组的关系
1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...
- C语言学习笔记之数组与指针的关系
首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...
- c语言学习笔记 - 指针和字符串
前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...
- c语言学习笔记 函数数组传递笔记
今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...
- Go语言学习笔记(4)——数组和切片
1 数组的特点: 长度固定.元素数据类型相同.下标从0开始 1.1 声明和初始化: var array_name [size] type var arr1 [10] float32 ...
- c语言学习笔记.指针.
指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...
- C语言学习笔记--指针阅读技巧
1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...
随机推荐
- [C#]生成预定义全颜色表
生成Color类所有static预定义成员的颜色表 const long CELLS_PER_LINE = 10; const float MARGIN = 12; const float CELL_ ...
- eclipse中的maven配置
1.下载最新版eclipse,包含maven版本 2.配置maven本地仓库(修改settings.xml)
- zepto下动画返回顶部
function scroll(scrollTo, time) { var scrollFrom = parseInt(document.body.scrollTop) ...
- MySQL安装配置,命令,异常纪要
一.Mac上的安装配置 // brew安装 brew install mysql // 设置为开机启动 brew services start mysql ...
- SQLite 入门教程(三)好多约束 Constraints(转)
转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...
- JavaWeb文件的上传与下载(1)
经常用到的上传: 头像上传,资料分享等 文件上传的步骤 1.指定表单类型为文件上传表单 enctype="multipart/form-data" 2.表单提交方式必须为:post ...
- POJ 3670 , 3671 LIS
题意:两题意思差不多,都是给你一个序列,然后求最少需要改变多少个数字,使得成为一个最长不升,或者最长不降子序列. 当然3671是只能升序,所以更简单一点. 然后就没有什么了,用二分的方法求LIS即可. ...
- [TypeScript] 0.First Example
Create a greeter.ts file: class Student { fullname : string; constructor(public firstname, public mi ...
- nginx-systemtap-toolkit
https://github.com/openresty/nginx-systemtap-toolkit
- 更改Mysql数据库存储位置的具体步骤
首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定 一.首先把mysql的服 ...