C指针数组

C指针数组


#include <stdio.h>



#define AMAX 4



int main() {

    char *name[AMAX] = {"Illegal month", "Jan", "Feb", "Mar"};

    char **p = name;

    for (int i = 0; i < AMAX; ++i) {

        printf("%s\n", *p);

        p++;

    }

}


Illegal month

Jan

Feb

Mar


name是一个数组,数组的每个元素都是char * (指向char的指针)。

*p是一个指针,指针指向char*,char **p 指向数组的首位元素(第一个指针)。

数组名不是变量,不能进行++或=操作


上面是使用指针,对于数组使用下标会更简单。

#include <stdio.h>



#define AMAX 4



int main() {

    char *name[AMAX] = {"Illegal month", "Jan", "Feb", "Mar"};  

    for (int i = 0; i < AMAX; ++i) {

        printf("%s\n", name[i]);

    }

}


结果和指针操作一样。



上面是利用%s直接输出字符串,接下来利用指针挨个输出字符

#include <stdio.h>



#define AMAX 4



int main() {

    char *name[AMAX] = {"Illegal month", "Jan", "Feb", "Mar"};

    char **ap = name;

    for (int i = 0; i < AMAX; ++i) {

        char *cp = *ap;

        while (*cp != '\0') {

            printf("%c  ", *cp);

            cp++;

        }

        printf("\n");

        ap++;

    }

}


I  l  l  e  g  a  l     m  o  n  t  h  

J  a  n  

F  e  b  

M  a  r


同样,使用数组下标会更简洁

#include <stdio.h>



#define AMAX 4



int main() {

    char *name[AMAX] = {"Illegal month", "Jan", "Feb", "Mar"};

    for (int i = 0; i < AMAX; ++i) {

        char *p = name[i];

        while (*p != '\0') {

            printf("%c  ", *p);

            p++;

        }

        printf("\n");

    }

}



理解:指针指向的类型一一对应即可



需要注意的是指针数组作为参数传递时,参数是指向指针数组的指针

#include <stdio.h>



#define AMAX 4



void t(char *argv[]);



int main() {

    char *name[AMAX] = {"Illegal month", "Jan", "Feb", "Mar"};

    // printf("%s\n", *++name);  // 错误

    t(name);

}



void t(char *argv[]) {

    // argv 是指向name的指针

    printf("%s\n", *++argv);

}


name是数组名,不能进行++操作,而argv是指针,可以进行++操作。

这是上面错误的原因。

展开阅读全文