《C语言学习笔记》指针数组及其应用

  C语言中,最灵活但又容易出错的莫过于指针了。而指针数组,是在C中很常见的一个应用。指针数组的意思是说,这个数组存储的所有对象都为指针。除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样。  

1 #include <stdion.h>
2
3 int main() {
4     int i;
5     char *name[] = {"BASIC", "FORTRAN", "C++", "Pascal", "COBOL"};
6     for (i = 0; i < (sizeof(name)/sizeof(char *)); i++)
7         printf("%s ", name[i]);
8     return 0;
9 }

  上面的代码中,定义了一个名为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命令的一个简单实现。

 

 1 #include "apue.h"
 2 #include <dirent.h>
 3
 4 int main(int argc, char *argv[])
 5 {
 6     DIR                *dp;
 7     struct dirent    *dirp;
 8
 9     if (argc != 2)
10         err_quit("usage: ls directory_name");
11
12     if ((dp = opendir(argv[1])) == NULL)
13         err_sys("can‘t open %s", argv[1]);
14     while ((dirp = readdir(dp)) != NULL)
15         printf("%s\n", dirp->d_name);
16
17     closedir(dp);
18     exit(0);
19 }

   这样的应用,在UNIX中,不知还有多少。一开始学习C语言时,完全是蒙的。不知其有何具体用处。而学了UNIX之后,就发现UNIX就是C的最佳实践。毕竟,C是作为写UNIX的工具而发明的。

时间: 2024-10-13 00:06:26

《C语言学习笔记》指针数组及其应用的相关文章

C语言学习笔记 (004) - 数组名和数组首地址(转)

一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中).所谓数组的指针是指数组的起始地址,数组元素的指针数组元素的地址. 这种指针变量的定义与以前介绍的指向变量的指针变量相同.应当注意,如果数组为int型,则指针变量亦应指向int型. C语言规定数组名代表数组的首地址,也就是第一个元素的地址.因此,下面两个语句等价: p=&a[0]: p=a: 注意数

C语言学习笔记--指针和数组的关系

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的

go语言学习笔记(1)—数组与切片

数据(array)与切片(slice) 数组声明: ArrayType???= "[" ArrayLength "]" ElementType . 例如: var a [32] int var b [3][5] int ? 在Go和C中,数组的工作方式有几个重要的差别.在Go中, (1)数组是值类型.将一个数组赋值给另一个,会拷贝所有的元素. (2)?如果你给函数传递一个数组,其将收到一个数组的拷贝,而不是它的指针. (3)数组的大小是其类型的一部分,类型[10]i

C语言学习笔记--指针阅读技巧

1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注意: 当读出是数组时,须读出元素个数.元素类型 当读出是函数是,须读出参数及类型,返回值类型 当读出是指针是,须读出指针所指向的类型,有时也须读出指针的类型. ① int (*p)(int*, int (*f)(int*)); A.读未标示符 f,向右遇”)”括号,调转向左遇*,所以 f 是个指针,

C语言学习笔记-6.数组

一.一维数组的定义和使用 1.C语言中,数组元素的下标是从0开始 2.定义数组时,需要设定它的长度,该长度必须是一个整型常量 注:常量采用宏定义优势:用简短标识符代替长数据 有利于程序修改和升级 用易于理解的标识符代替不好记的数据 格式:#define PI 3.14 (没有分号) 3.如果对全部的数组元素赋予初值,则可以不指定数组的长度 在初始化时,如果初值的个数少于元素个数,则剩余的自动补0 二.字符数组与字符串 1.字符串通常都保存在字符数组中,每个元素存放一个字符,以'\0'结尾 2.字

C语言学习笔记--指针概念

指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向的内存空间中的值. ①*号类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值. ②变量 p 保存着变量 i 的内存地址,即 p==&i, *p==i #include <stdio.h> int main() { int i = 0; int* pI; char* pC; float*

C和指针 学习笔记-3.数组与指针

数据名代表首地址 指向数组的指针 #include <stdio.h> extern void iterate(int *p); void main(){ int a[]={1,2,3,4,5}; iterate(a); } void iterate(int *p){ int i; for(i=0;i<5;i++){ printf("%d",*p++); } } 指向一维数组的指针 int (*p)[3] #include <stdio.h> void i

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

C语言学习笔记(五) 数组

数组 数组的出现就是为了解决大量同类型数据的存储和使用的问题: 数组的分类:一维数组.二维数组. 一维数组:为多个变量连续分配存储控件:所有的变量的数据类型必须相同:所有变量所占的字节大小必须相等: 例如:int a[4]; 一维数组名不代表数组中的所有元素而是代表数组中第一个元素的地址: 数组的初始化: 完全初始化: int a[4] = {1,2,3,4}; 不完全初始化: int a[4] = {1};  未被初始化的元素的值默认为0; 数组清零 int a[4] = {0}; 不初始化:

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data