一:指针
1指针:指针就是地址,地址就是指针,指针是虚拟的,地址是真实存在的。
2.如何判断语句是何种类型:
int p; p是基本的整型。
int *p; p和*结合说明p是一个指针,类型是int* ,指向是int类型。
int p[5]; p和[]运算,说明p是一个数组,并且数组中元素是int类型。
int *p[5]; p和[]先结合,说明p是一个数组,再和*结合说明数组里面的元 素是指针 并且指向int类型。P是一个返回int类型的指针的数组。
int(*p)[5]; p和()结合,说明p是一个指针,指向int类型的数组,p是一个 指向整型数组的指针。
int *p ; p是一个指针,指针指向的内容,又是一个指针,指向一个int类 型数据。
int p(int); p是一个函数,函数形参是int类型,函数返回值是int类型。
int (*p)(int); p是一个指针,指向函数,函数的形参是int型,返回值是int类 型,p 是一个指向形参为int返回值为int函数的的指针。
Int p(int *); p是一个函数,函数的形参是指向int类型的指针,返回值是int类 型 P是一个形参为指向int类型的指针返回值是int的函数。
int *( * p ( int ) ) [3]; p是一个函数,函数是形参是int返回值是指针的, 该指针指向数 组,数组中的元素又是指针,指向int类型。
总结 :1.先确定p的类型,与* 与()与[],可以确定指针,函数,数组 类型。
2.结合时候的优先级()> [] > *。
3.函数指针 ,指针函数,数组指针, 指针数组,重点落在后两个汉字。
二:指针分类
1.指针类型 ,指针指向:
int * p; P是一个int* 类型的指针,指向int;
int **p; p是一个int** 类型的指针, 指向int*;p是一个二级指针指向地址的地址 指针的指针就是地址的地址;
int * (* p) [4]; p是一个int*(*)[4]的类型的指针(sizeof*(*)[4] = 4),指向int *()[4];
总结: 指针类型:去掉名字。
指针指向:去掉名字和左边*。
2.指针的值 指针所占内存:
a.指针的值:存放一个地址。
b.指针所占内存: 系统给指针自身也要开辟空间,占四个字节(在32编译环境中指针占4个字节)。
1. 指针可以进行整数的加减,但和平时加减有天壤之别。
char a[20];
Int *prt = (int *)a;// (int *)是强制类型转换,数组名是一个指针既地址。
ptr+5;// ptr指向数组,ptr存放了a的地址,a的地址就是数组首元素的地址,所以 ptr存放了首元素地址,ptr指向首元素,所以它是一级指针。+5,就是行操作,又因 为是指向int所以是四个字节,一个单位,故ptr+5,指向字符数组第二十个元素。
注意:a.字符数组在C++有特殊待遇,要输出array[],就必须先强制转换(void *)。
b. 数组名是指针(array = * ptr 一级指针)其地址就是首元素地址。
3.2级指针进行加减毫无意义
int ** p =&q;
p+4;//这是一个非法的操作,指针变量p是一个二级指针。4. 指针和指针进行加减:指针不能进行加法运算,可以减法操作,但类型必须相等(一 般用在数组)。
5. 运算符&和*:
这里&是取地址运算符,*是间接运算符(指针运算符,也是取值运算符)。
&a 的运算结果是一个指针,地址就是指针,指针类型*a。
*p 运算结果五花八门,指针可以指向整型,指针,数组,函数等,其本质:是它的 类型是其指向的类型,它所占用的地址是p所指向的地址。
四 指针和数组:
1.指针
int *str;指针变量str 加减就是左右加减,注意只能对一级指针进行左右加减。
对数组的话也就行加减如果是多维数组看成一维数组的数组。
str ---------------》指向str首元素。
str + 1 ----------》指向str第二个元素,行运算。
*(str +1)--------》取出str第二个元素,*是取址运算符,取出第二个元素。
*str +1----------》值运算 ,取出第一个元素的值再+1。
2.数组名:
两个含义:a.代表的类型是Type类型的数组。
b.一个指针常量;他是一个Type*的指针指向Type 。
数组名的特点:数组名是一个常量指针,数组名的自身地址 = 首元素的地址。3. 数组名有关的sizeof:
----->sizeof(array) 是数组本身的字节大小,不能当做求指针字节大小的运算符。
----->sizeof(array +n) 是指针大小 指针占四个字节。
----->sizeof(*array) 是取值运算 也是指针指向 ,数组array指向第一个单元的大小既等 于sizeof(*(array+0)) = sizeof(a[0])。
注意: 由上例子可以看出若只是给数组名求大小,其实就是给数组求大小,和指针没 关系;
如给数组成员求sizeof 要用取值运算符* ,*(array+1)就是第一个元素的大 小; 若要求数组指针的sizeof 可以用sizeof(array +n) = 4; n 可以是0,要求指针 必须写上不写0 ,就是求数组大小 这是一个规定,,就是区别当sizeof数组名时 候,有+是指针,没有+ 是数组 ,可以清楚到底是求哪一种sizeof。
五 指针和结构体
定义结构体之后 构造一个对象,给对象初始化就是实例化对象(对象类似于数 组,但和数组有本质的差别,因为数组是同一类型的数据集合,而结构体可以存放不 同类型的数据)。
可以构造一个结构体的指针 其初始化就是对象的地址,这个取地址符&不能省 缺,类似数组,却没有数组名的功能 要访问对象中的成员,可以构造一个指针,三 种方法:a.用成员访问符. (ss.a)
b.用指针指向符-> (ptr->a )取值符->
c.可以用(*ptr).a 相等于(*ptr)就是取出指针ptr指向的对象ss再通过成员访问 符,访问成员。