【问题标题】:why argv works, but lineptr don't ? (pointer and array in C)为什么 argv 有效,但 lineptr 无效? (C中的指针和数组)
【发布时间】:2020-09-18 09:27:19
【问题描述】:
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {

    char *lineptr[] = {"abc","defg","hijk"};
    char **lp = lineptr;
    int nlines = 3;
    while(nlines-- > 0){
        printf("%s\n", *lineptr++);
    }

    while(--argc)
        printf("%s%s",*++argv,(argc>1) ? " " : "");
    printf("\n");

    return 0;
}

【问题讨论】:

  • lineptr 是一个数组(指针),argv 是一个指针(指向指针)。数组和指针是不同的。请参阅comp.lang.c. faq 的第 6 节。
  • 我认为 argv 也是一个指针数组,因为它们的声明是相同的。那么为什么它们有相同的声明,但 lineptr 是一个数组而 argv 是一个指针呢?
  • 当在参数中使用时,数组语法对于指针来说是很吸引人的。即int main(int argc, char *argv[]) 100% 与int main(int argc, char **argv) 完全相同(int foo(int bar[]) 也与int foo(int *bar) 100% 完全相同)。
  • ????????????非常感谢

标签: arrays c pointers


【解决方案1】:

您在第一个 printf 语句中有一个错误:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {

    char *lineptr[] = {"abc","defg","hijk"};
    char **lp = lineptr;
    int nlines = 3;
    while(nlines-- > 0){
        printf("%s\n", lineptr[nlines]); /* see the difference to your line */
    }

    while(--argc)
        printf("%s%s",*++argv,(argc>1) ? " " : "");
    printf("\n");

    return 0;
}

顺便说一句,在处理数组时最好使用 FOR 循环,因为它更易于管理且不易出错。

for(int i=0; i<nlines; i++) /* nlines = 3 */
{
    printf("%s\n", lineptr[i]);
}

【讨论】:

  • 您的编码是正确的,但这不是我的意图。我想了解C中Pointer和array的区别。那么作为一个带指针的数组,为什么*++argv可以工作,而*lineptr++不行?
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多