指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。
int i;
int *pi = &i;
int **ppi = π
这样定义之后,表达式*ppi
取pi
的值,表达式**ppi
取i
的值。请读者自己画图理解i
、pi
、ppi
这三个变量之间的关系。
很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到:
int ***p;
数组中的每个元素可以是基本类型,也可以复合类型,因此也可以是指针类型。例如定义一个数组a
由10个元素组成,每个元素都是int *
指针:
int *a[10];
这称为指针数组。int *a[10];
和int **pa;
之间的关系类似于int a[10];
和int *pa;
之间的关系:a
是由一种元素组成的数组,pa
则是指向这种元素的指针。所以,如果pa
指向a
的首元素:
int *a[10];
int **pa = &a[0];
则pa[0]
和a[0]
取的是同一个元素,唯一比原来复杂的地方在于这个元素是一个int *
指针,而不是基本类型。
我们知道main函数的标准原型应该是int main(int argc, char *argv[]);
。argc
是命令行参数的个数。而argv
是一个指向指针的指针,为什么不是指针数组呢?因为前面讲过,函数原型中的[]
表示指针而不表示数组,等价于char **argv
。那为什么要写成char *argv[]
而不写成char **argv
呢?这样写给读代码的人提供了有用信息,argv
不是指向单个指针,而是指向一个指针数组的首元素。数组中每个元素都是char *
指针,指向一个命令行参数字符串。
例 23.2. 打印命令行参数
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i = 0; i < argc; i++)
printf("argv[%d]=%s\n", i, argv[i]);
return 0;
}
编译执行:
$ gcc main.c
$ ./a.out a b c
argv[0]=./a.out
argv[1]=a
argv[2]=b
argv[3]=c
$ ln -s a.out printargv
$ ./printargv d e
argv[0]=./printargv
argv[1]=d
argv[2]=e
注意程序名也算一个命令行参数,所以执行./a.out a b c
这个命令时,argc
是4,argv
如下图所示:
由于argv[4]
是NULL
,我们也可以这样循环遍历argv
:
for(i=0; argv[i] != NULL; i++)
NULL
标识着argv
的结尾,这个循环碰到NULL
就结束,因而不会访问越界,这种用法很形象地称为Sentinel,NULL
就像一个哨兵守卫着数组的边界。
在这个例子中我们还看到,如果给程序建立符号链接,然后通过符号链接运行这个程序,就可以得到不同的argv[0]
。通常,程序会根据不同的命令行参数做不同的事情,例如ls -l
和ls -R
打印不同的文件列表,而有些程序会根据不同的argv[0]
做不同的事情,例如专门针对嵌入式系统的开源项目Busybox,将各种Linux命令裁剪后集于一身,编译成一个可执行文件busybox
,安装时将busybox
程序拷到嵌入式系统的/bin
目录下,同时在/bin
、/sbin
、/usr/bin
、/usr/sbin
等目录下创建很多指向/bin/busybox
的符号链接,命名为cp
、ls
、mv
、ifconfig
等等,不管执行哪个命令其实最终都是在执行/bin/busybox
,它会根据argv[0]
来区分不同的命令。
1、想想以下定义中的const
分别起什么作用?编写程序验证你的猜测。
const char **p;
char *const *p;
char **const p;
分享到:
相关推荐
指针是C/C++编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。指针是一个变量,其存储的是内存地址,该地址指向另一个变量。理解并熟练使用指针,是提升编程技能的关键步骤。 一、指针的基础概念 1. ...
本文将深入探讨指针指针(指针的指针)的应用及其理解方法。 首先,我们要明白指针的基本构成和类型。一个指针声明通常由以下几个部分组成: 1. **指针的类型**:指针所指向的数据类型,如`int*`、`char*`等。 2. ...
"c++句柄、智能指针和指针的区别" 在C++编程中,句柄、智能指针和指针是三个相关但不同的概念。理解它们之间的区别对于初学者来说非常重要。 首先,让我们来讨论指针和句柄的区别。指针是指向物理内存地址的指针...
C语言中的指针是其强大的特性之一,也是学习C语言的关键。指针允许程序员直接操纵内存地址,从而实现高效和灵活的编程。本教程将深入探讨指针的概念、使用和重要性。 首先,理解指针的基本概念至关重要。在计算机中...
C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...
指针变量运算与指针数组相关知识点 指针变量是C语言编程中一个非常重要的概念,它允许我们直接访问和操作内存中的数据。指针变量是存储了数据地址的一种变量,它可以是数组、字符串、函数或普通变量的地址。 1. ...
指针、指针数组和多级指针的概念与应用 在编程语言中,指针是非常重要的概念之一。指针是一种变量,它存储的是另一个变量的内存地址,而不是实际的值本身。通过指针,可以访问和操作内存中的数据。今天,我们将重点...
指针 指针是一种保存变量地址的变量,是一种基本的计算机编程概念。它允许开发者直接访问和操作计算机内存中的变量,从而提供了更高的灵活性和控制力。 概念 在计算机中,内存是由存储单元构成的,每个存储单元...
### C语言指针详解:函数指针与指针函数 #### 第十章 指针 **一、指针的基本概念** 指针是C语言中一个非常重要的概念,它允许程序员直接操纵内存地址,这对于提高程序效率至关重要。理解指针的基础概念是学好...
### 函数指针与指针函数的理解 #### 一、函数指针与指针函数的基本概念 在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。...
### C++指针应用教学:让你不再害怕指针 #### 前言:复杂类型说明 在编程领域,特别是对于C++这样的强类型语言而言,理解指针的概念及其使用方式至关重要。指针作为C++中一种特殊的变量类型,能够直接操作内存地址...
### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...
在易语言编程中,"整数型转换到子程序指针"是一个常见的操作,涉及到程序设计中的类型转换和函数调用机制。易语言是一种以中文为语法的编程语言,旨在降低编程难度,让非计算机专业的人也能进行软件开发。在这个主题...
在C++编程语言中,指针是一个至关重要的概念,它提供了对内存地址的直接操作,使得我们可以高效地处理数据和实现复杂的数据结构。本篇主要探讨C++中的指针,特别是涉及C与C++中函数指针和指针函数的使用。 首先,...
### 指针详解 #### 一、理解复杂类型的规则 在编程中,尤其是C语言或C++等底层语言中,指针是一个重要的概念。掌握指针不仅能够帮助程序员更好地控制程序的行为,还能够提高代码的效率。对于初学者而言,理解和...
### 指针详解:不再畏惧C语言中的指针 #### 前言:理解复杂类型 在深入了解指针之前,我们首先需要掌握如何解析较为复杂的类型声明。这对于理解指针至关重要,因为指针本身的定义可能包含多个层级的复杂度。 ####...
C语言中的指针是其强大的特性之一,也是学习C语言时的一大难点。本文将深入探讨C指针的概念、用途、操作及其潜在的陷阱,帮助你彻底掌握这一关键知识点。 一、指针的基本概念 指针在C语言中扮演着变量地址的角色,...
指针是C/C++等编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。本文将深入探讨指针的定义、类型、运算以及如何有效地使用指针,旨在帮助初学者克服对指针的恐惧,提升编程技能。 首先,我们要理解指针...