无法增加指针位置
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++ 中增加一些内容。
指针
初等整数。
有些东西默认情况下不能递增,例如 类,除非您实现递增运算符对它们的意义。
有些东西你永远无法增加。
- 数组。
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 数组的关键字。
为什么我不能增加指针数组的位置?
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++ 中增加一些内容。
指针
初等整数。
有些东西默认情况下不能递增,例如 类,除非您实现递增运算符对它们的意义。
有些东西你永远无法增加。
- 数组。
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 数组的关键字。