黑马程序员-C语言-指针

——- ios培训ios培训、期待与您交流! ———-
什么是指针?
严格意义上,指针有两种含义:一是指一种数据类型.二是指一种保存地址的变量.是用于存储某一个地址,从而可以通过地址直接对该地址内存空间中的数据进行操作.
使用方法
定义: 类型 *指针名;
如:int *p;表示定义一个能存int类型地址的指针变量, 名字叫p.
赋值: 指针变量名=指针(地址).
注意:指针获取方法(&变量名).
指针的特点
1.指针本身也有地址.指针定义之后,自身地址不变,但里面的存的地址可以变化.

int a=1;
int *p=&a;//这一步等效于int *p; p=&a;
printf("&a=%p---&p=%p\n",&a,&p);

以上就是用指针变量存储了a的地址,打印结果是不一样的

  1. &p表示指针自身地址,而p表示指针存的地址 *p表示指针所存地址的内存空间.
int a=1;
int *p;
p=&a;//等效于*p=1;

以上操作后,就可以说*p就是a;
3. 指针不初始化赋值不要使用.未赋值前地址是随机的.未赋值不可以用*p.

int a=1;
int *p;
//p=&a; 这里被注释掉了

以上操作是创建了一个指针变量p,而没有把任何地址存储到这个变量中,那么现在这个变量里面存储的是一个随机的地址,这个指针就是一个野指针.
4. *修饰什么,就表示是什么的指针.判断原则:先确定变量的类型.(根据符号优先级)

int *p2=&b;
    int *p3[3];//指针类型的数组
    p3[0]=p2;
    printf("p3[0]=%p\n",p3[0]);
     int (*p4)[3];//数组的指针

以上比较容易混淆,有个通用方法,用括号把*和变量名括起来的一定表示一个指针.
5. 指针是什么类型的,就应该存什么类型的地址.否则*p取对应内存空间的值会出错.

int *p5;
    double d=2.1;
    p5=&d;
    printf("*p5=%d\n",*p5);//*p5无法取到正确的值.

以上会出错,一开始定义的指针是int型的,不可以把一个double的变量的地址给他.
指针与数组的关系
什么是指针数组?
表示一个数组,用来存指针的数组就叫指针数组.数组里面的元素都是指针.
创建一个这样的数组:

 int *p[3];//表示定义一个可以存三个int指针的数组.
 int a1=1,a2=2,a3=3;     
 int *p[3]={&a1,&a2,&a3};  //这个数组存放了三个int指针 
 int *temp;
 temp=p[0];//把数组里面第0个元素取出来,是一个指针.

什么是数组的指针?
表示一个指针,而这个指针类型是数组.

int arr[3]={1,2,3};
int (*p)[3];表示这是一个含有三个元素的int数组的指针.
int (*p)[3]=&arr;

注意:int (*p)[3]=&arr;
数组的指针在表示的时候一定要把”* “和指针变量名括起来,不然指针变量先与[]结合.成数组了.
什么是数组元素的指针?
表示一个指针,而这个指针存的是数组一个元素的地址.

int arr[1]={1};
    //定义并赋值
    int *p=&arr[0];
    printf("*p=%d,arr[0]=%d\n",*p,arr[0]);

这里可以对比一下数组的地址arr与&arr[0]等值不等效.
数组的指针的特点
1.数组名表示第一个元素的地址,&数组名表示整个数组的地址.二者值相同,但意义不同.
2.指针可以运算.但仅限于加减运算.运算的实质就是地址运算.即地址的移动.

int arr[3]={1,2,3};
int *p1=&arr[1];
int a=*(p1+1);//p1的值并没有改变.a的值为3

p1是数组元素的指针,可以表示一个元素(arr[1])的地址,当p1+1的时候就表示另外一个元素(arr[2])的地址了.
3.地址(+1)向高位移动,而(-1)向低位移动.不同指针类型移动一位(+1或-1)的字节数不同.
4.实际移动的字节数看指针类型,类型占多少个字节,一位就移动多少个字节.

int arr[]={1,2,3,4};
int* pArr=arr;//这里pArr代表的是数组的指针
int* pTemp=&arr[0];//这里pTemp代表的是数组第一个元素的指针
*(pArr+1)代表指针向高位移动了12个字节.
*(pTemp+1)代表指针向高危移动了4个字节.

指针与函数
指针型函数:是函数. 这个函数的返回值类型是指针;
定义:类型 * 函数名(参数){return 指针类型;}
创建一个指针型函数

int *add()
{return &a;}.表示定义一个返回值是int指针类型的add函数.

函数指针
是指针.函数也会在内存开辟一块空间.函数指针即这块空间的地址.
定义:函数返回值类型 (*指针名)(参数类型);赋值:指针名=函数名;
创建一个函数的指针

void add(int a){ 
}. 
int (*p)(int)=add;

以上就是把函数add()的指针赋值给了p;函数名在传递的时候传递的就是指针,所以在取add地址的时候用&.
函数指针的特点
1.函数指针做加减运算可以,但没有意义.不建议.
2.函数指针可以当作参数传递.因为其是一个指针类型.
3.不管什么类型的指针,只要是指针,其里面存的就是地址.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值