How pointer to array works?

后端 未结 2 815
故里飘歌
故里飘歌 2021-01-17 08:23
int s[4][2] = {
                  {1234, 56},
                  {1212, 33},
                  {1434, 80},
                  {1312, 78}
              };

int (*p)[1];         


        
2条回答
  •  北恋
    北恋 (楼主)
    2021-01-17 08:39

    s[0]points to a location in memory. That memory location happens to be the starting point of int s[4][2]. When you make the assignment p = s[0], p and p+0 also point to s[0]. So when you print any one of these with a "%d" specifier, you will get the value stored at that location which happens to be `1234'. If you would like to verify the address is the same for all of these, use a format specifier "%p" instead of "%d".

    EDIT to address OP comment question...

    Here is an example using your own int **s:

    First, C uses pointers. Only pointers. No arrays. The [] notation gives the appearance of arrays, but any variable that is created using the [] notation (eg. int s[4][2]) is resolved into a simple pointer (eg. int **s). Also, a pointer to a pointer is still just a pointer.

    int a[8]={0}; (or int *a then malloced) will look the same in memory as will:
    int a[2][4]; ( or in **a=0; then malloced)

    The statment:
    s[row][col] = 1;
    creates the same object code as
    *(*(s + row) + col) = 1;

    It is also true that

    s[row] == *(s + row)

    Since s[row] resolves to a pointer, then so does *(s + row)

    It follows that s[0] == *(s + 0) == *s

    If these three are equal, whatever value is held at this address will be displayed when printing it.

    It follows that in your code: given that you have assigned p = s[0]; and s[0] == *s

    *(*(p + 0)) == *(s[0] + 0) == *s[0] == **s
    
    printf("%d\n", >>>fill in any one<<<); //will result in 1234
    

    Note, in the following printf statements, your comment indicates addresses were printed. But because you used the unsigned int format specifier "%u",

    Consider p == s[0]; which is a pointer to the first location of s.  Note that either s[0][0] or **s would give you the value held at the first location of s, but s[0] is the _address_ of the first memory location of s.  Therefore, since p is a pointer, pointing to the address at s[0], the following will give you the address of p, or s[0] (both same):
    
        printf("%p\n", *p);          // 1256433(address of s[0][0])  
    

    As for *p, p was created as int (*p)[1]; and pointer array of 1 element. an array is resolved into a pointer, so again, in the following you will get the address pointing to s[0]:

    printf("%u\n", **p);
    

    In summary, both p and *p are pointers. Both will result in giving address when printed.

    Edit 2 Answer to your question: So my question is what is the difference between a simple pointer and a pointer to an array?

    Look toward the bottom of this tutorial download a pdf. It may explain it better...

    But in short, C Does not implement arrays in the same way other languages do. In C, an array of any data type always resolves into a pointer. int a[10]; is just really int *a;, with memory set aside for space to hold 10 integers consecutively. In memory it would look like:

    a[0] a[9] |0|0|0|0|0|0|0|0|0|0| (if all were initialized to zero)

    Likewise you would be tempted to think of float b[2][2][2]; as a 3 dimensional array: 2x2x2, it is not. It is really a place in memory, starting at b[0] that has room for 8 floating point numbers. Look at the illustrations HERE.

提交回复
热议问题