关于C#:指针算术对我来说还不清楚

Pointer arithmetic isn't clear to me

本问题已经有最佳答案,请猛点这里访问。

我有要在其中增加指针的代码。但是编译器不喜欢我的表达。这是代码:

1
2
int * p_int[5];
p_int++;

编译器给出错误:

lvalue required as increment operand p_int++;

我认为p_int++;等同于p_int[++i]


在您的代码中,p_int++p_int[++i]不相同。第一个尝试修改p_int本身,而第二个则没有。

数组名称不是可修改的左值,不能用作++的操作数。


不能修改数组,但是可以修改其元素。 p_int是一个数组,不能是增/减运算符的操作数或=运算符的左操作数。
数组是不可修改的lvalue

I thought that p_int++; would be equivalent to p_int[++i]

不。数组不是指针。如果p_int在这种情况下也是指针,则p_int++也不等同于p_int[++i]

声明一个指向数组p_int的指针,然后可以对其进行修改

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.....