【问题标题】:Questions about pointers and C arrays关于指针和C数组的问题
【发布时间】:2014-03-17 09:48:29
【问题描述】:

如果您声明一个指针和一个 C char 数组,这样:

char arr[100];
char *ptr;

我说的对吗

*ptrptr[] 相同,也就是说它是指向动态数组中第一个元素的指针?

然后,如果我要循环通过 NULL 终止的 char 数组,这样

printf("Enter a string");
gets(arr);
char *ptr = someCharString;
int increment;
while(*ptr++ != '\0')
     increment++;

因此,increment 现在给出了字符串的长度(假设它是 NULL 终止的)。我认为这就是strlen 的工作原理..

所以这和ptr[length_of_char_string]是一样的

我如何将*ptr 重置回ptr[0],这样我就可以循环遍历*ptr,因为我有这样的长度,

for(int i = 0;i < increment;i++){
   if(*ptr++ = 'a'){//Need ptr to start at the first element again
   //Do stuff
   }
}

【问题讨论】:

  • 您可以将第一个元素的地址保存在其他变量中。
  • 我认为你的意思不是char *ptr = someCharString;,而是char *ptr = arr;
  • 不要使用gets()gets() 使用是保证缓冲区溢出漏洞。请改用fgets()

标签: c arrays pointers


【解决方案1】:

char * 不等于数组的名称。您可以将指针用作数组(例如 ptr[0] 可以),但您不能将数组用作指针(例如 array++ 是 NG)。

您可以为 ptr 定义一个克隆。

char *ptr = someCharString;
char *ptr_bak = ptr;

for(int i = 0; i < increment; i++){
   if(*ptr++ = 'a'){//Need ptr to start at the first element again
       ptr = ptr_bak;
   }
}

【讨论】:

    【解决方案2】:

    我是否正确地说
    *ptrptr[] 相同,换句话说,它是指向动态数组中第一个元素的指针?

    没有。 Arrays are not pointers.
    当您声明char *ptr; 时,这意味着ptr 的类型为pointer to char。但是当您将其声明为char ptr[n]; 时,这意味着ptrnchars 的数组。仅当将它们声明为函数的参数时,上述两者才等效。

    我强烈推荐你阅读c-faq: 6. Pointers and Arrays

    【讨论】:

      【解决方案3】:

      类似:

      char *temp_ptr;
      
      temp_ptr = ptr;
      
      for(int i = 0;i < increment;i++){
          if(*ptr++ = 'a'){
             ptr = temp_ptr
             //Do stuff
          }
      }
      

      这是您的程序可接受的解决方案吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 2023-01-08
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        相关资源
        最近更新 更多