指针算术我不清楚
Pointer arithmetic isn't clear to me
我有我想要递增指针的代码。但是编译器不喜欢我的表达。这是代码:
int * p_int[5];
p_int++;
编译报错:
lvalue required as increment operand p_int++;
我认为 p_int++;
等同于 p_int[++i]
数组不能修改,但它的元素可以。 p_int
是一个数组,它不能是 increment/decrement 运算符的操作数或 =
运算符的左操作数。
数组是不可修改的 lvalue
。
I thought that p_int++;
would be equivalent to p_int[++i]
没有。数组不是指针。如果 p_int
在这种情况下也是一个指针,p_int++
将不等同于 p_int[++i]
。
声明一个指向数组的指针p_int
然后你可以修改它
int * p_int[5];
int **ptr = p_int;
ptr++; //This will work
在您的代码中,p_int++
和 p_int[++i]
不 相同。第一个尝试修改 p_int
本身 ,而第二个则不会。
Array names are not modifiable lvalues 不能用作 ++
.
的操作数
你应该使用数组指针
int arr_int[5] = {4,5,6,7,8};
int (*p_int)[5];
p_int = &arr_int;
p_int++; // p_int++; jumps forward 5 places in memory. (5 x sizeof(int))
// to iterate over the array elements do for(int i =0;i<5;i++){ (*p_int)[i];}
您可能正在寻找这个:
int ar[5] = {2,3,4,6,7}; // an int array
int * p; // a int pointer
p = ar; // attach the array to pointer, an array is always an array of pointers so p = &ar; gives a error.
for(i=0;i<5;i++){printf("%d\n",*p++);} // dereference the *p and add 1 to the address the p holds as value.
.
#include <stdlib.h>
#include <stdio.h>
int main(){
int i = 0;
char arr[3][10] = { // double dimensional array.
{ "Hello"},
{ "Welcome"},
{ "Good bye."},
};
char (*ptr)[10]; // array pointer.
ptr = arr; // assign array to pointer.
for( ; i < 3 ; i++ ){
// print memory address, and array value.
printf("%p : %s \n", (*ptr), (*ptr));
// jump to next array = current memory address + 9.
ptr++;
}
printf(" ======================= \n");
char second_arr[8] = { 'W','e','l','c','o','m','e'};
char (*second_ptr)[8]; // array pointer.
second_ptr = &second_arr; // assign array to pointer.
printf("memory address: %p txt: %s \n", (*second_ptr), (*second_ptr));
printf(" ======================= \n");
for(i = 0 ; i < 7 ; i++ ){
// print memory address, and array value.
printf("%p : %c \n", (*second_ptr), (*second_ptr)[i]);
// jump to next array = current memory address + 9.
}
return 0;
};
第二个例子。 // * Typedef 数组指针 * //
int i = 0, ERROR = 1, CRASH = 5, GOOD = 6, BUG = 8;
char succes_text[3][60] = {
{"Awesome performance detected !!\n"},
{"Your system and program are performing a expected.\n"},
{"No problems detected, proceeding next task.\n"}
};
char error_text[3][60] = {
{ "Undefined error detected, call the help-desk.\n"},
{ "Warning, bad algorithmic behavior.\n"},
{ "Program manager found a bug, save your work.\n"}
};
typedef char (*SUCCES_TEXT_TYPE)[60];
SUCCES_TEXT_TYPE SUCCES_TEXT = succes_text;
typedef char (*ERROR_TEXT_TYPE)[60];
ERROR_TEXT_TYPE ERROR_TEXT = error_text;
char * testfunc(int i, SUCCES_TEXT_TYPE s_txt, ERROR_TEXT_TYPE e_txt){
if(i == ERROR){ return (*e_txt);}
if(i == CRASH){ e_txt += 1; return (*e_txt);}
if(i == BUG){ e_txt += 2; return (*e_txt);}
if(i == GOOD){ return (*s_txt);}
return "";
}
int main(){
for(;i < 10; i++){
printf("%s",testfunc(i, SUCCES_TEXT, ERROR_TEXT));
}
return 0;
};
// END SECOND EXAMPLE.....
我有我想要递增指针的代码。但是编译器不喜欢我的表达。这是代码:
int * p_int[5];
p_int++;
编译报错:
lvalue required as increment operand p_int++;
我认为 p_int++;
等同于 p_int[++i]
数组不能修改,但它的元素可以。 p_int
是一个数组,它不能是 increment/decrement 运算符的操作数或 =
运算符的左操作数。
数组是不可修改的 lvalue
。
I thought that
p_int++;
would be equivalent top_int[++i]
没有。数组不是指针。如果 p_int
在这种情况下也是一个指针,p_int++
将不等同于 p_int[++i]
。
声明一个指向数组的指针p_int
然后你可以修改它
int * p_int[5];
int **ptr = p_int;
ptr++; //This will work
在您的代码中,p_int++
和 p_int[++i]
不 相同。第一个尝试修改 p_int
本身 ,而第二个则不会。
Array names are not modifiable lvalues 不能用作 ++
.
你应该使用数组指针
int arr_int[5] = {4,5,6,7,8};
int (*p_int)[5];
p_int = &arr_int;
p_int++; // p_int++; jumps forward 5 places in memory. (5 x sizeof(int))
// to iterate over the array elements do for(int i =0;i<5;i++){ (*p_int)[i];}
您可能正在寻找这个:
int ar[5] = {2,3,4,6,7}; // an int array
int * p; // a int pointer
p = ar; // attach the array to pointer, an array is always an array of pointers so p = &ar; gives a error.
for(i=0;i<5;i++){printf("%d\n",*p++);} // dereference the *p and add 1 to the address the p holds as value.
.
#include <stdlib.h>
#include <stdio.h>
int main(){
int i = 0;
char arr[3][10] = { // double dimensional array.
{ "Hello"},
{ "Welcome"},
{ "Good bye."},
};
char (*ptr)[10]; // array pointer.
ptr = arr; // assign array to pointer.
for( ; i < 3 ; i++ ){
// print memory address, and array value.
printf("%p : %s \n", (*ptr), (*ptr));
// jump to next array = current memory address + 9.
ptr++;
}
printf(" ======================= \n");
char second_arr[8] = { 'W','e','l','c','o','m','e'};
char (*second_ptr)[8]; // array pointer.
second_ptr = &second_arr; // assign array to pointer.
printf("memory address: %p txt: %s \n", (*second_ptr), (*second_ptr));
printf(" ======================= \n");
for(i = 0 ; i < 7 ; i++ ){
// print memory address, and array value.
printf("%p : %c \n", (*second_ptr), (*second_ptr)[i]);
// jump to next array = current memory address + 9.
}
return 0;
};
第二个例子。 // * Typedef 数组指针 * //
int i = 0, ERROR = 1, CRASH = 5, GOOD = 6, BUG = 8;
char succes_text[3][60] = {
{"Awesome performance detected !!\n"},
{"Your system and program are performing a expected.\n"},
{"No problems detected, proceeding next task.\n"}
};
char error_text[3][60] = {
{ "Undefined error detected, call the help-desk.\n"},
{ "Warning, bad algorithmic behavior.\n"},
{ "Program manager found a bug, save your work.\n"}
};
typedef char (*SUCCES_TEXT_TYPE)[60];
SUCCES_TEXT_TYPE SUCCES_TEXT = succes_text;
typedef char (*ERROR_TEXT_TYPE)[60];
ERROR_TEXT_TYPE ERROR_TEXT = error_text;
char * testfunc(int i, SUCCES_TEXT_TYPE s_txt, ERROR_TEXT_TYPE e_txt){
if(i == ERROR){ return (*e_txt);}
if(i == CRASH){ e_txt += 1; return (*e_txt);}
if(i == BUG){ e_txt += 2; return (*e_txt);}
if(i == GOOD){ return (*s_txt);}
return "";
}
int main(){
for(;i < 10; i++){
printf("%s",testfunc(i, SUCCES_TEXT, ERROR_TEXT));
}
return 0;
};
// END SECOND EXAMPLE.....