C语言学习指针和数组2

一.指针和数组的区别

数组名是一个地址,而指针是一个左值。

二.指针数组和数组指针

int *p1[5]; 指针数组 //  []中的优先级高,故先定义了一个长度5的整型数组,然后数组中的每个元素都是指向int的指针。

int (*p2)[5];数组指针 //()和[]优先级一样,结合后从左往右,故先定义了一个指向整型的p2指针,它指向有5个元素的一维数组。

 1.指针数组 (example)

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    int e = 5;
    int *p1[5] = {&a, &b, &c, &d, &e};
    int i;

    for (i = 0; i < 5; i++)
    {
        printf("%d
", *p1[i]);
    }

    return 0;
}

#include <stdio.h>

int main()
{
    char *p1[5] = {
    "让编程改变世界", 
    "just do it",
    "一切皆有可能",
    "永不止步",
    "one more thing" 
    };
    int i;
    for (i=0;i<5;i++){
        printf("%s
",p1[i]);
    }
    return 0;
}

 2.数组指针(example)

#include <stdio.h>

int main()
{
    int temp[5] = {1, 2, 3, 4, 5};
    int (*p2)[5] = &temp;
    int i;

    for (i = 0; i < 5; i++)
    {
        printf("%d
", *(*p2 + i));
    }

    return 0;
}

#include <stdio.h>

int main()
{
    int temp[5] = {1, 2, 3, 4, 5};
    int *p = temp;
    int i;

    for (i = 0; i < 5; i++)
    {
        printf("%d
", *(p + i));
    }

    return 0;
}

//#include <stdio.h>
//
//int main()
//{
//        int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20};
//        int *p = (int *)(&array + 1);
//         
//         printf("%d
",sizeof(array)); // 84
//        printf("%p
", &array);   //--> 十进制 6487536 
//         printf("%p
", (&array+1)); //--> 十进制 6487620 差了一个sizeof(array) 
//         printf("%p
", (&array+2)); //-->十进制 6487704 
//        printf("%d
", *(p -4));
//
//        return 0;
//}

#include <stdio.h>

int main()
{
        int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int (*p)[10] = &array;

        printf("%d
", *(*(p+1)-6));

        return 0;
}

必须清楚一个指针变量将告诉我们两个信息:某个数据结构的起始地址,以及该结构的跨度。比如 int p = &a; 说明该指针指向变量 a 的起始地址,以及它的跨度为 sizeof(int)。所以 p + 1 == p + sizeof(int)。
int (*p)[10] 虽然是定义一个整型指针,但不要忘了它后边还有一个数组,所以它的跨度应该是 sizeof(int) * 10,而 array 作为数组名,它的含义是“指向数组第一个元素的地址”,所以 array 的跨度是 sizeof(array[0]),因此编译系统遇到 int (*p)[10] = array; 这样的定义就会果断报错:“左右类型不一致”。

 指针指向的数组+1:偏移量详解:https://www.cnblogs.com/liushui-sky/p/10025732.html

 运算符优先级引用https://fishc.com.cn/forum.php?mod=viewthread&tid=67664&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571

原文地址:https://www.cnblogs.com/guoweilf/p/11550726.html