想问一道关于指针的问题,就是整型和字符型的指针问题


#include<stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    char* p = arr;
    printf("%d", *p+1);
}


arr是一个整型数组,一个元素占4个字节
char是字符型指针,加1不是只能访问一个字节吗,怎么输出结果是2
*p+1的意思是数组的第0个元素值加1,所以是2。是先执行*p,获得第0个元素值
如果你要得到数组第1个元素值,那么要用*(p+1),指针先后移,然后再取值

*p = 1
*p + 1 = 2
这里是先取值再加一
不是*(p+1)

char* p = arr;会报错吧,无法从“int [10]”转换为“char *”

#include <stdio.h>
int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    char *p = arr; // 强制转换int *指针为char *
                   // p指针的值等于arr首地址
                   // int占4个字节,arr在内存排列是
                   //  | 0x00000A |     ^
                   //  | 0x000009 |     |
                   //    ...         栈地址增加方向
                   //  | 0x000002 |
                   //  | 0x000001 | <-- arr
                   // arr第一个元素是1,在小端机器上内存字节排列顺序是
                   //  | 0x00 |   ^
                   //  | 0x00 |   |
                   //  | 0x00 | 栈地址增加方向
                   //  | 0x01 | <-- p, arr
                   // 因此p指向的是0x01字节
    printf("%d", *p + 1); // *p + 1就是把0x01字节加1,即2
}