无法增加指针位置

Can't increment pointer position

为什么我不能增加指针数组的位置?

typedef char SmallBuffer[20]; 
SmallBuffer sb2,  sb1 = "wtf!";

while(*sb1 !=  '[=10=]'){ 
     .....
     ++sb1;
}  

编译 gcc 编译器时 returns :

main.c:19:38:
error: lvalue required as increment operand
++sb1;

整数数组也会发生这种情况。

======= 更新 1 =====

我尝试了许多其他方式(当然是作为一个指针)

typedef char *String;
String a = "wtf!";
    while(*a != NULL){
        *a = TO_UPPER(*a); ++a;
    } printf("%s", a);

任何人都可以指出我的代码有什么问题吗?

==== 更新 2 =====

此代码来自Stephen Kochan - Programming in C

第 311 页

while ( *string != '[=12=]' )
{
*string = TO_UPPER (*string);
++string;
}

谁能给我解释一下这段代码? (过去 4 小时我一直在尝试这个狗屎)

在您的代码中,sb1 表示一个数组变量名(char[20] 类型的数组)。 数组变量名不是可修改的左值。所以,它不能作为前置自增运算符的操作数。

相关,引用 C11,章节 §6.3.2.1,(强调我的

A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a constqualified type, and if it is a structure or union, does not have any member (including, recursively, any member or element of all contained aggregates or unions) with a constqualified type.

并且,对于一元前缀递增(和递减)运算符,第 6.5.3.1 章

The operand of the prefix increment or decrement operator shall have atomic, qualified, or unqualified real or pointer type, and shall be a modifiable lvalue.


=======更新=====

在您的第二个代码段中,您实际上是在尝试修改 字符串文字 ,这是非法的并会调用 undefined behavior.

再次引用 C11,章节 §6.4.5/p7,字符串文字

[...] If the program attempts to modify such an array, the behavior is undefined.

您可以在 C++ 中增加一些内容。

  1. 指针

  2. 初等整数。

有些东西默认情况下不能递增,例如 类,除非您实现递增运算符对它们的意义。

有些东西你永远无法增加。

  1. 数组。

sb1 是一个数组,在您的代码中。您不能递增数组。那是一个毫无意义的操作。

数组不是指针。指针不是数组。您在发布的代码中没有任何指针。

然而你试图在数组上使用指针运算,这是不允许的,也没有意义。

将您的代码更改为此,它将起作用:

typedef char SmallBuffer[20]; 
SmallBuffer sb2,  sb1 = "wtf!";
char* sbp1= &sb1[0];
while(*sbp1 !=  '[=10=]'){
     sbp1++;
}

sb1 不是左值,但 sbp1 是。 sb1 是 'array' 而 sbp1 是 'pointer'。指针与数组不同,数组确实包含一个数组,而指针确实包含可能指向特定数组的内存地址。可以在指针变量中提升内存地址,但不能提升数组。

另一种可能是像这样增加数组的索引:

typedef char SmallBuffer[20]; 
SmallBuffer sb2,  sb1 = "wtf!";
int i= 0;
while(*sb1[i] !=  '[=11=]'){
     i++;
}

=======更新=====

为了您的更新; 我已经稍微简化了你的代码来解释为什么它不起作用,我还添加了一些评论:

char* a = "wtf!"; //Create pointer 'a' and assign the memory address of the first letter of the constant char array "wtf!" to it
while(*a != NULL){
    *a = TO_UPPER(*a); //Write the uppercase of *a to the constant char which is positioned at memory place 'a'
    ++a;
}

您想写入一个常量字符,这是不可能的,因为该字符是常量(逻辑上)。

您可以通过使 char 数组 "wtf!" 不是常量来解决问题;

char stringArray[]="wtf!";
char* a = &stringArray[0]; 
while(*a != 0){
    *a = TO_UPPER(*a); 
    ++a;
}
printf("%s", stringArray);

或包括 typedef:

typedef char *String;
char stringArray[]="wtf!";
String a = &stringArray[0]; 
while(*a != 0){
    *a = TO_UPPER(*a); 
    ++a;
}
printf("%s", stringArray);

在这段代码中,我假设您已经创建了一个函数 'TO_UPPER'。我也改了'printf line'。 printf("%s", a) 不会打印任何内容,因为指针已上升,因此它指向字符串末尾的终止 0。 我还用 0 替换了 'NULL'。我假设你想在字符串的末尾停止。字符串以 0 结尾。'NULL' 是另一个用途的关键字。

=======更新2=====

为了你的更新2; 你没有包括整个代码。如果你像这样在它前面添加一些行,编码的片段将工作得很好;

char stringArray[] = "wtf!";
char* string = &stringArray[0];
while ( *string != '[=15=]' )
{
    *string = TO_UPPER (*string);
    ++string;
}

但我可以建议您不要使用 'string' 作为变量名,因为它会让 Whosebug 上的其他人感到有些困惑。在 c 中没问题,但在 c++ 中 'string' 是 char 数组的关键字。