关于指针和C数组的问题

关于指针和C数组的问题,c,arrays,pointers,C,Arrays,Pointers,如果声明指针和Cchar数组,则: char arr[100]; char *ptr; 我这样说对吗 *ptr与ptr[]相同,换句话说,它是指向动态数组中第一个元素的指针 然后,如果我在一个NULL终止的char数组中循环,那么 printf("Enter a string"); gets(arr); char *ptr = someCharString; int increment; while(*ptr++ != '\0') increment++; 因此,increment

如果声明指针和C
char
数组,则:

char arr[100];
char *ptr;
我这样说对吗

*ptr
ptr[]
相同,换句话说,它是指向动态数组中第一个元素的指针

然后,如果我在一个
NULL
终止的
char
数组中循环,那么

printf("Enter a string");
gets(arr);
char *ptr = someCharString;
int increment;
while(*ptr++ != '\0')
     increment++;
因此,increment现在给出字符串的长度(假设它是
NULL
终止的)。我想这就是strlen的工作原理

那么这是否与说
ptr[length\u of\u char\u 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
   }
}
for(int i=0;i
我说得对吗
*ptr
ptr[]
相同,换句话说,它是指向动态数组中第一个元素的指针

否…
当您声明
char*ptr
则表示
ptr
是指向char的
指针类型。但是当你声明它为
charptr[n]
则表示
ptr
n
char
s的数组。只有当它们被声明为函数的参数时,这两个函数才是等价的

我强烈建议您阅读。

类似以下内容:

char *temp_ptr;

temp_ptr = ptr;

for(int i = 0;i < increment;i++){
    if(*ptr++ = 'a'){
       ptr = temp_ptr
       //Do stuff
    }
}
char*temp\u ptr;
温度=温度;
对于(int i=0;i

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

char*不等于数组的名称。您可以将指针用作数组(例如ptr[0]可以),但不能将数组用作指针(例如,数组++为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;
   }
}
char*ptr=someCharString;
char*ptr_bak=ptr;
对于(int i=0;i
您可以将第一个元素的地址保存在其他变量中你的意思是
char*ptr=arr不要使用
get()
gets()
usage是一个有保证的缓冲区溢出漏洞。改用
fgets()