Pointer arithmetic isn't clear to me
本问题已经有最佳答案,请猛点这里访问。
我有要在其中增加指针的代码。但是编译器不喜欢我的表达。这是代码:
1 2 | int * p_int[5]; p_int++; |
编译器给出错误:
lvalue required as increment operand p_int++;
我认为
在您的代码中,
数组名称不是可修改的左值,不能用作
不能修改数组,但是可以修改其元素。
数组是不可修改的
I thought that
p_int++; would be equivalent top_int[++i]
不。数组不是指针。如果
声明一个指向数组
1 2 3 | int * p_int[5]; int **ptr = p_int; ptr++; //This will work |
您应该使用数组指针
1 2 3 4 5 | 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];} |
您可能正在寻找:
1 2 3 4 5 | 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\ ",*p++);} // dereference the *p and add 1 to the address the p holds as value. |
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #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 \ ", (*ptr), (*ptr)); // jump to next array = current memory address + 9. ptr++; } printf(" ======================= \ "); 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 \ ", (*second_ptr), (*second_ptr)); printf(" ======================= \ "); for(i = 0 ; i < 7 ; i++ ){ // print memory address, and array value. printf("%p : %c \ ", (*second_ptr), (*second_ptr)[i]); // jump to next array = current memory address + 9. } return 0; }; |
第二个例子。 // * Typedef数组指针* //
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int i = 0, ERROR = 1, CRASH = 5, GOOD = 6, BUG = 8; char succes_text[3][60] = { {"Awesome performance detected !!\ "}, {"Your system and program are performing a expected.\ "}, {"No problems detected, proceeding next task.\ "} }; char error_text[3][60] = { {"Undefined error detected, call the help-desk.\ "}, {"Warning, bad algorithmic behavior.\ "}, {"Program manager found a bug, save your work.\ "} }; 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..... |