c的指针笔记

常见的指针类型

void* p

当我们要解引用这个指针时,要进行强制类型转换。如*(int*)p

1.整型指针 存放整型的地址的指针    int* p=&a

 指针和数组的一些关系,当把数组首元素地址交给指针变量,那么这几种写法都是等价的。

理解:关键是*(p+i)=p[i] 因为1=2=3,而arr和p都是首地址,所以有*(p+i)=p[i]   arr和pa 数组指针会出现*pa[i]=arr[i],但是理解是一样的,在数组指针里面 *pa就是存放数组的地址,相当于*pa=p   pa是数组指针  p是指针

 2.字符指针 存放字符的地址的指针   char* p=‘a'/NULL/“abc”  第三种是把字符串首字母的地址交给了指针p。并且最合理的方式是const保护字符串数据,因为这种是常量字符串。

3.数组指针 存放数组的地址的指针    int arr[10]={0};      int(*pa)[10]=&arr   表示 a是个指针 指向能存10个整型的数组    int是和数组的数据类型保持一致,如果数组定义是 char* arr[10],相应的数组指针定义是

   char* (*pa)[10]=&arr      

数组的名字是数组的元素的首地址  arr=&arr[0] !=&arr  但是&arr是整个数组的地址,

sizeof(arr)arr也表示整个数组。

 

 使用数组指针的时候,例如第一种情况,pa指针 存放的是数组的地址,那么 *pa就是拿到了数组的地址,因为数组的地址和数组首元素的地址相同,相当于我们拿到了数组名,也就是(*pa)[i]=arr[i];  注意数组的地址虽然和数组首元素的地址相同,但是概念不一样,具体表现为地址+1时,元素地址步进为元素类型的长度 2-4-8,但是数组地址步进为整个数组的长度。

这几种写法等价。同样的*(p+i)拿到的是i行的首地址,我们把i行本身定义成一个数组,所以*(p+i)[j] 理解同上,  *(*(p+i)+j)是地址步进得到每个元素的地址在取值,*(p[i]+j)是 *(p+i)=p[i](参考数组和指针的那里),p[i][j]也是如此理解。

一般二维数组以上才使用数组指针。

4指针数组 是一个数组,存放的是指针,也就是某些变量的地址    int* arr[10]={&a,&b,...}

5函数指针 存放函数地址的指针       (函数名是函数的首地址)

注意: &运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做,

c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。 因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址,

它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针!

如何定义函数指针, 首先是个指针 *pa,其次函数 (*pa)(),再其次看函数的返回类型 int/char等等,没有返回用void;  int(*pa)();此时*pa的值就是函数,相当于直接调用函数。

指向函数指针的指针定义   void (*p)(char*)  可以这样理解,void (*)(char*)是类型,表示函数指针,函数指针指向的函数参数是 char*,   p是指向函数指针的指针变量。

      

一些语句理解

 

 用typedef 关键字来重新定义类型名

 函数指针使用

 函数指针数组以及指向函数指针数组的指针的定义

参考普通指针的用法   *实际加不加无所谓,但是理解上不一样。

 

6指针函数  

一个返回值是指针的函数

使用注意事项:局部变量的地址可能会被销毁分配给别人,注意使用全局变量定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值