A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© weizhang00 中级黑马   /  2014-11-21 08:23  /  781 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    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;}最后展示了一个返回指针的函数

评分

参与人数 1黑马币 +1 收起 理由
星河鹭起 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马