指针对数组的输出格式

int main()
{
    int arr[] = { 1,2,3,4,5,6,7 };//1,数组名是指针常量?
    int *p;//2,为什么要定义指针类型?
    p = arr;
    printf("%p\n",p);
    printf("%p\n",arr);//输出结果显示,arr的地址与p的地址相同
    for (int i = 0; i < 7; i++)
    {
        //printf("%d\t",arr[i]);//输出结果:1234567.
        //printf("%d\t",p[i]);//3、输出结果:1234567.
        //printf("%d\n",*p);//4、输出结果:1111111.
        //printf("%d\n",*(arr+i));//5、输出结果:1234567
        //printf("%d\n",*(p+i));//输出结果:1234567
        //printf("%d\n",*p++);//6、输出结果:1234567
        //printf("%d\n",(*p)++);//输出结果:1234567
        //printf("%d\n",*++p);//输出结果:234567+(随机数)
        //printf("%d\n",++*p);//输出结果:2345678
    }
    return 0;
}

1、数组名是指针常量?数组名既能指代整个数组,同时数组名的地址与数组首元素地址相同,所以,数组名可以唯一指向数组首元素,即为指针常量。

2、为什么要定义指针类型?指针变量在32位、64位操作系统所占内存分别位4个字节和8个字节。指针内保存的是地址,如果要输出地址里面的内容,就需要定义指针变量的数据类型,否则如何知道我要输出几个字节?对于一个没有类型的指针变量,如果对指针做运算操作,系统是不知道你这一次移动的一位是指几个字节。若指定类型便明确了,如,int *p;那么*(p+1)就是一次移动四个字节。

3、p[i]。因为p指向的是arr,p=arr,所以p[i]=arr[i]。也就是说此时是以数组的方式对元素进行输出的。

4、*p.此时p仅仅指向arr[0]的地址,所以输出的结果始终为1.

5、*(arr+i)。以arr为指针常量做偏移量的操作,若是*arr,则输出的是arr[0]=1的值,若arr的地址+1,此时指针指向的是arr[1]的地址,所以输出的2,以此类推。

6、*p++。指针偏移量运算。可以写作*(p++)。*的元素级别比++的高,所以想运算*p,再进行++运算。

7、(*p)++。值运算。这里不涉及指针的偏移,仅仅是对*p做++运算。

8、*++p。从左到右指针偏移量运算。可以写作*(++p)

9、++*p。值运算。

你可能感兴趣的:(C语言)