8.3 指针数组和多级指针

一、指针数组

(一)指针数组认识

  1. 概念 若一个数组的元素均为指针类型的数据,则这个数组叫做指针数组。
  2. 指针数组的定义
int *p[4]
  1. 指针数组的用处 指针数组比较适合指向若干个字符串,使字符串的处理更加方便灵活。 例如,如果想建立一个字符串的集合,而字符串本身就是一个一维数组,这样就需要建立一个二维数组去表达一个字符串的集合,二维数组的定义需要指定行列数,但是如果字符串本身未知大小,都按最长的算就会造成空间浪费!所以指针数组只把每个单一字符串的首地址存上,每一个元素指向每一个单一的字符串,这样就更加的灵活方便啦。

(二)指针数组作为main函数参数

  1. 一般简单程序的main函数是不写参数的,但是实际上很多时候,main函数可以有参数。 格式如下:
    int main (int argc,char *argv[])

  2. argc 和 argv 就是main 函数的参数。
    argc是指参数个数;argv是指参数向量,它是一个*char 指针数组,数组中的每一个元素(其值为指针/地址)指向命令行中的一个字符串的首字符。

  3. 程序是由main函数开始执行的,显然传给main函数的实参只能由操作系统来完成。这是怎么回事呢?

  4. 以我们常见的DOS等系统的操作命令状态下,在命令行中包含了给main函数传的参数,其一般格式为:
    命令 参数1 参数2 file1 china beijing 其中file是一个命令,命令名是可执行文件名,假设是file1.exe 这个文件里由main函数
    china beijing 就是要传给可执行文件main函数的参数。
    结果是: argc = 3;
    argv[0] = "file1"
    argv[1] = "china"
    argv[1] = "beijing"

二、多级指针

int main (void)
{
    int i=10;
    int * p = &i;
    int ** q = &p;
    int *** r = &q;
    /*
    r里面只能存放 int ** 类型的变量的地址
    要用r表示 i ,已知*r表示q,则用r 表示i 需要写成 ***r
    */
}
void f(int ** q)
{
    // *q 就是g函数里的p
    **q =  100;
    // **q 就是 i
}
void g()
{
    int i=10;
    int *p=&i;
    f(&p);
    printf("%d\n",i);
}
int main(void)
{
    g();
    return 0 ;
}
//输出100

本文章使用limfx的vsocde插件快速发布