黑马程序员-c语言指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

0x7fff5fbff744 0x7fff5fbff744 10

*p定义了一个指针变量,只能存放地址,所以通过&寻址符,将a的地址赋值给指针p

然后使用*访问地址符,访问p地址并更改值为10

最终打印的结果也很明显,两个地址完全一样,而且a通过指针间接被修改为10

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

5

上面的代码表示了指向指针的指针,所以出现了多个*符号

  int arr[5] = {10,9,8,7,6};
    int *ap;
    ap = arr;
    printf("ap : %d\n",*(ap + 2));//加1的长度取决于类型
    printf("arr : %d\n",*(arr + 2));

ap : 8

arr : 8

关于数组和指针呢,数组名代表其首元素的地址,所以不需要&符号

而且由于数组本身就是地址,所以指针指向后和数组本身的方法是通用的

指针+1其实表示的是地址变更,而变更幅度和类型相关

 //常量区,堆:对象,栈:局部变量
    char name[] = "abc";//这种写法是字符串变量
    char *name2 = "abc";//这种是字符串常量
    char *name3 = "abc";
    printf("name:%p\nname2:%p\nname3:%p\n",name,name2,name3);

name:0x7fff5fbff72c

name2:0x100000f4b

name3:0x100000f4b

name[]和*name有根本的区别,存放的区域不同,而且*name无法更改

注意:由于name2进入常量区,所以name3再次指向“abc”时,实际上是接入了同样的地址


    char *name4[5] = {"abc","bbc"};
    printf("%s\n",name4[0]);
    //name4[0][0] = 'A';
    printf("%s\n",name4[1]);

abc

bbc


字符串指针数组的写法

    void (*o)();
    o = text;
    (*o)();
    o();

void text(){
    printf("text!\n");
}

text!

text!

这里的代码展示了指向函数的指针,以及如何通过指针调用函数,因为函数名和数组一样就是地址,所以也不需要&符号

int *back(){
    int *p;
    return p;
}
最后展示了一个返回指针的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值