《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 步骤,直到阅读结束 注 ...
随机推荐
- Jquery JS 正确比较两个数字大小的方法
if(2 > 10) { alert("不正确!"); } 此比较不会是想要的结果:它相当于2 >1,把10的第一位取出来比较. ——————————————————— ...
- SQLite 入门教程(一)基本控制台(终端)命令 (转)
转于: SQLite 入门教程(一)基本控制台(终端)命令 一.基本简介 SQLite 是一个自持的(self-contained).无服务器的.零配置的.事务型的关系型数据库引擎.因为他很小,所 ...
- java Graphics2D 画图
在Java中,当需要画一些特殊的形状时,比如说椭圆.矩形等,可以使用 Graphics2D 来绘图. 一些API: g.drawLine(3,3,50,50);//画一条线段 g.drawRect(8 ...
- 使用HttpClient进行http post/get方法的调用,以及使用dom4j解析xml
import java.io.IOException; import java.util.List; import javax.servlet.ServletInputStream; import j ...
- Linux 内核进程管理之进程ID 。图解
http://www.cnblogs.com/hazir/tag/kernel/ Linux 内核进程管理之进程ID Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数 ...
- linux 清空文件内容命令
清空文件内容命令 $ echo "" >log.log > 是重写,覆盖式 >>是尾部追加
- linux启动的过程
总结一下,linux的开机整个流程. · 1: 启动电源后,主机第一步先做的就是查询BIOS(全称:basic input/output system 基本输入输出系统)信息.了解整个系统的硬件状态, ...
- 玩转Android之数据库框架ActiveAndroid的使用
ActiveAndroid是一个开源的数据库框架,使我们在Android中使用数据库变得更为简单,今天我们就来看看这个数据库框架的使用. 1.引入ActiveAndroid 首先创建我们自己的项目,在 ...
- Android 自定义View修炼-Android 实现自定义的卫星式菜单(弧形菜单)View
一.总述 Android 实现卫星式菜单也叫弧形菜单的主要要做的工作如下:1.动画的处理2.自定义ViewGroup来实现卫星式菜单View (1)自定义属性 a. 在attrs.xml中 ...
- Eclipse内存溢出问题
我们经常遇到eclipse内存溢出问题,实际上只需要修改eclipse程序目录下的eclipse.ini文件, -Xms40m -Xmx1000m -XX:MaxPermSize=256m