C语言指针

0,一维数组

    int a[]={3,4,5,7,3,6,6};
    int *p=a;
    printf("%p\n", p);
    printf("%p\n", a);
    printf("%p\n", &a[0]);

    
    printf("%d\n", p[0]);
    printf("%d\n", a[0]);

输出:

0x7ffeefbff5e0
0x7ffeefbff5e0
0x7ffeefbff5e0
3
3

 

1,二维数组

 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
 int (*p)[4]=a;//指针p指向了一个二维的数组
    
    printf("%p\n", a);
    printf("%p\n", &a[0]);
    printf("%p\n", a[0]);
    printf("%p\n", &a[0][0]);
    printf("%p\n", *p);
    printf("%p\n", p);

输出:

0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0
0x7ffeefbff5d0

分析图:

 

2,指向字符串的指针与字符数组

 2.1指向字符串的指针

char*ptr="zfbanzhangzaiyiqi";

    printf("%p\n", ptr);
    printf("%s\n", ptr);

输出:

0x100000f9a
zfbanzhangzaiyiqi

分析:

"zfbanzhangzaiyiqi"是放在常量区的无法通过ptr指针去修改"zfbanzhangzaiyiqi"这个字符串

ptr指向了常量字符串"zfbanzhangzaiyiqi"的首地址,所以可以通过%s将全部字符串输出来

 

2.2字符数组

char str[]="zfbanzhangzaiyiqi";

    printf("%s\n", str);

输出:

zfbanzhangzaiyiqi
分析:str在内存空间给zfbanzhangzaiyiqi是分配空间的,放在栈中的,所以可以通过str去修改"zfbanzhangzaiyiqi"

 

3,char型指针数组

    char*name[]={
        "aaaa","bb","ccc"
    };
    

    printf("%p\n", name);
    printf("%p\n", &name[0]);

    printf("%p\n", name[0]);//name[0]里面的内容是“aaaa”的首地址
    printf("%p\n", &name[0][0]);//name[0]指向了name[0][0]的首地址
    printf("%s\n", name[0]);//name[0]里面的所有字符串

输出:

0x7ffeefbff5f0
0x7ffeefbff5f0
0x100000f98
0x100000f98
aaaa

 

4,分析指针变量的类型以及指针指向的类型

    int a=10;
    int *p=&a;
    printf("%p\n", p);
    printf("%d\n", *p);

输出:

0x7ffeefbff5fc
10

分析:

指针p的类型:int*p中去除p后int*就是指针的类型即指向整型的指针

指向的类型:int*p中去除*p后就是指向的类型即整型

 

5,const关键字及使用

    int a=10;
    int *const p=&a; 代表常量指针,指针的指向不能变,但a变量可以改变

    const int * p=&a;  int const * p=&a; 或者代表指向常量的指针,指针的指向可以变,但a变量不可以改变

 

6,函数指针与指针函数

函数指针:指向函数类型的指针变量

先定义一个函数

int sum(int a,int b){

 

}

定义函数指针直接拷贝函数声明

int sum(int a,int b),然后将函数名替换int (*p)(int a,int b),a和b这里可以省略

然后指针初始化

p=sum;//p指向了sum函数

int result=p(23,45)//用函数指针间接的调用函数

例:(可类比第0条中指向一维数组指针的使用)

int sum(int a,int b){
    
    return a+b;
    
}

 int (*p)(int a,int b);
    p=sum;

        printf("%p\n", p);
        printf("%p\n", sum);
        printf("%p\n", &sum);
        printf("%d\n", sum(2,3));
        printf("%d\n", p(2,3));

输出:

0x100000eb0
0x100000eb0
0x100000eb0
5
5
 

 

 

指针函数:函数的返回值是指针
 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值