4.c练习-复杂指针

#include <stdio.h>

#if 0
//数组指针与指针数组
int main(void)
{
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    int e = 5;
    int in[5] = {0};
// 指针数组的实质是一个数组,存储的内容是指针变量:int *p[5];
    int *p[5] ={NULL};
// 数组指针的实质是一个指针,指针指向的是一个数组:int (*p)[5];
    int (*p1)[5] = NULL;
    p[0] = &a;
    p[1] = &b;
    p[2] = &c;
    p[3] = &d;
    p[4] = &e;
    // p1 = in;    //错误,p1是数组指针,可以指向一个数组的地址,而in表示数组的首元素首地址
    p1 = &in;//正确,&in是整个数组的地址,p1是数组指针,可以指向这个数组
    printf("a[0]=%d\n",*p[0]);//解引用p[0]存的地址
    return 0;
}
#endif
#if 0
//函数指针
void func(int a)
{
    int b =20;
}

int main(void)
{
    // func对应的类型为void (*) (int);
    //对应的函数指针为
    void (*p) (int) = func;//函数指针p指向了函数func
    void (*p1) (int) = &func;//函数指针p指向了函数func的地址
    //函数名表示第一句代码的地址,&func表示整个函数的地址
    printf("sizeof(func)=%d,sizeof(&func)=%d",sizeof(func),sizeof(&func));
    //sizeof(func)=1,sizeof(&func)=8有待考虑为什么

    char *strcpy(char *dest, const char *src);
    // 对应的函数指针是:       注意这里的char*是返回值类型
    char *(*pFunc)(char *dest, const char *src);
    return 0;
}
#endif
#if 0
// 二重指针:指针数组指针 
void func(char **p)
{
    *p =NULL;
}
int main(void)
{
    char *p = NULL;//一重指针
    char **pp = NULL;//二重指针
    char *p1[5]={NULL};//指针数组
    char a = 'a';
    p = &a;
    pp = &p;//正常
//二重指针指向指针数组
    pp = p1;//编译可以通过,说明,二重指针和指针数组是相同的
    // p1表示&p1[0];p1本质是数组名,这里也表示数组首元素首地址
    // 数组的元素是char *类型的.故p1表示的是p1[0]这个char*元素
    // 的指针.和pp的意义相同

// 函数传参时,为通过函数内部改变外部的指针变量指向的地址
    printf("p1 = %p\n",p);
    func(&p);
    printf("p1 = %p\n",p);
    return 0;
}
#endif
// 二维数组的两种访问方式
int main(void)
{

    int a[2] = {1,2};
    int *p = a;//可以用指针访问一维数组了
    // printf("%d \n",*(p+1));
    // 指针方式访问一维数组

    // 二维数组和一位数组没有本质区别
    int aa[2][3] = {1,2,3,4,5,6};//二维数组
    int (*p2)[3] = aa;//数组指针指向二维数组
    // 上面一行相当于:
    int (*p3)[3] = &aa[0];
    // 二维数组的第一维的首元素地址
    // 相当与第二维数组整体的数组地址
    aa[1][2] = 9;
    printf("%d \n",*(*(aa+1)+2));
    printf("%d \n",*(*(p2+1)+2));
    printf("%d \n",*(*(p3+1)+2));
    // *(p3+1)相当与第二维中的首元素地址
    //这三个结果都是相同的
    int * p4 = aa[0];
    // int * p4 = &aa[0][0];//与上相同
    printf("%d \n",*(p4+1));//aa[0][1]的值

    return 0;
}

int (*p2)[第二维n];
//数组指针指向二维数组
二重指针指向指针数组
有些乱了0.0…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huaxiaos

感谢您的打赏!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值