《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 步骤,直到阅读结束 注 ...
随机推荐
- jenkens构建脚本
Build Root POM Goals and options Command # consts SERVER="192.168.60.209" DEPLOY=" ...
- C#使用参数数组
重载,是指在相同的作用域内,声明多个同名的方法.用以对不同类型或数量的参数的参数执行相同的操作.比如,可以求两个或者三个 int类型数中的最大值,我们可以编写这样的方法实现: class Util { ...
- Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)
本文主要描写叙述了在Oracle Linux 6.3下安装Oracle 11gR2(11.2.0.3).从Oracle 11g開始,Oracle官方站点不再提供其Patch的下载链接,须要使用Meat ...
- GNU LIBC源代码学习之strcmp
比較两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL ...
- shared_ptr与weak_ptr的例子
12.20 编写程序,逐行读入一个输入文件,将内容存入一个StrBlob中,用一个StrBlobPtr打印出StrBlob的每个元素. StrBlob.h #ifndef STRBLOB_H #def ...
- oracle表锁住 解锁办法
第一种方法: 用系统账户如sys as SYSDBA 登录进去 1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode f ...
- ITopologicalOperator Buffer调用异常的解决方法 .异常来自 HRESULT:0x8004023E
最近在做一个分析功能时,需要循环调用Buffer来对图形创建缓冲区.在开发测试时没问题,但拿到客户实际使用时,出现异常. 后来把出异常的数据拿来测试,发现在调用Buffer时出错.但做为参数传入的图形 ...
- kindle paperwhite2 root 密码修改方法
昨天由于kindle的耗电量突然增大,开始查找原因.经过检查搜索后,确定是由于卡索引的问题导致,于是开始解决这个问题.然而在通过ssh以root身份登陆到kindle上时,始终出现登陆错误,提示密码不 ...
- 一个不错的flash 模板
听到好听的背景音乐,而且效果也挺不错的,忽然感觉flash好强大呀 1.模板浏览地址:http://www.cssmoban.com/cssthemes/5229.shtml 2.模板演示地址:htt ...
- 清除Eclipse和Myeclipse中的工作空间目录
打开Eclipse或者Myeclipse后,选择功能菜单里的Windows->Preferences->, 弹出对话框后,选择General->Startup and Shutdow ...