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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逗你玩儿LLY 中级黑马   /  2015-10-11 18:41  /  756 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一.指针
int  *p=&a;
p=&a;
*p=a;
注意:在定义时和应用时*p的含义不一样

/*
1.指针:用于存储某一个地址,从而可以通过地址直接对该地址内存空间的数据进行操作
     1).是一种保存地址的变量
     2).是一种数据类型
2.特点:
1).指针本身也是地址,指针定义之后自身地址不变,但是里面存的地址可以变化
2).&p--->指针自身地址
    p---->表示指针存的地址
    *p--->表示指针所存地址的内存空间(所存地址对应的值)
3).指针不初始化不能使用(未赋值前地址是随机的)
4).int *p[3];--->指针数组
    int (*p)[3];--->数组指针
5).指针是什么类型的,就应该存什么类型的地址,否则*p取对应内存空间的值会出错
*/



/*
1.指针数组:例 int *p[3];表示定义一个可以存放三个int指针的数组
赋值:int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3}; 取值:int *a=p[0];
表示一个数组,用来存放指针的数组就叫指针数组,数组里面的元素都是指针
2.数组指针:例 int (*p)[3];表示这是一个含有三个元素的int数组的指针
赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr;
表示一个指针,而这个指针类型就是数组.
3.数组元素的指针
赋值:int arr[1]={1}; int *p=&arr[0];
表示一个指针,而这个指针存的是数组一个元素的地址
*/

/*
1.当c是角标为m元素的指针的时候,c[x]=arr[x+m]
2.当用指针取元素时,如果出现越界,编译器不会报错(因为指针操作的是地址)
3.当用数组角标取元素时,如果出现越界,编译器会报错
*/

数组与指针的异同点
相同点:
1.二者都含有一个地址.
2.二者都能通过*变量名取值
3.二者都能通过变量名[角标]去取值.
4.二者都可以进行地址运算.
不同点:
1.二者是不同类型.数组:是构造类型 指针:指针类型
2.数组的字节长度是动态的,与类型和长度有关.而指针字节数是一致的(同一环境)
3.数组用变量名[角标]取值时越界会有警告.而指针没有.
4.数组用变量名[角标]取值时角标是谁的,就是哪个元素.但是指针是用当前地址对应的角标+当前给定的角标.
5.数组里面的地址不可以改变,而指针可以.
结论:数组具有指针的一部特性,但是它不是指针.二者是完全不同的两个数据类型

1.指针型函数:是函数,这个函数的返回值类型时指针
定义:类型 *函数名(参数){return 指针类型;}
例如:int *add(int *a){return &a;}
2.函数指针:是指针,函数也会在内存开辟一块空间,函数指针即这块空间的地址
定义:函数返回值类型 (*指针名)(参数类型);
赋值:指针名=函数名;
例如:先定义函数int add(int a){...}  int (*p)(int)=add;
使用:指针名(实参);如:p(3)等效于add(3);


0 个回复

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