指针笔记
-
指针变量
-
是个变量,是个指针变量,即这个变量用来存放一个地址编号
-
在32位平台下,地址总线是32位的,所以地址是32位编号,所以指针变量是32位即4个字节
-
-
注意:无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,即任何类型的指针变量都是4个字节的大小。
-
对应类型的指针变量,只能存放对应类型的变量地址。
-
扩展:字符变量 char ch ; ch占1个字节,他有一个地址编号这个地址编号就是ch的地址
-
整型变量int a;占4个字节,它占有4个字节的存储单元,有4个地址编号。a的地址就是存储单元编号最小的编号即0X2000;
-
指针的定义
-
简单的指针
-
语法格式:
-
数据类型* 指针变量名
-
in* p //定义了一个指针变量p
-
变量名是p
-
-
关于指针运算:
-
&取地址(获取一个变量的地址)
-
*取值 (再定义一个指针变量的时候起到标识作用,表明这一个变量是一个指针变量,其他地方都是获取一个指针变量保存的地址里面的内容)
-
-
如果在一行中定义多个指针变量,每一个指针变量前面都需要加*来修饰;
-
指针大小
-
在32位操作系统中所有指针都是4个字节(64位操作系统中为8个字节);
-
不管地址内的空间多大,地址编号长度是一样大的,所以32位操作系统中所有指针大小都是4个字节。
-
-
指针的分类
-
字符指针char *p
-
短整型指针 short int *p
-
整型指针 int *p
-
tips:多字节变量,占多个存储单元,每个存储单元都有地址编号
C语言规定,存储单元编号最小那个编号,是多字节变量的地址编号。
-
长整型指针 long int *p
-
float型的指针 float *p
-
double 型的指针 double *p
-
-
指针和变量的关系
-
指针可以存放变量的地址编号。
-
可以通过指针来引用变量
-
指针变量在定义时候,也可以初始化。
-
int a;
-
int *p =&a ; //用a的地址,给p赋值,因为p是指针变量,指针就是用来存放变量的地址的。
-
指针变量只能保存已经开辟好空间的变量的地址,不能随意保存地址。
-
-
扩展:
-
对应类型的指针,只能保存对应类型数据的地址,如果想让不同类型的指针相互赋值的时候,需要强制类型转换
-
注意:
-
*指针 取值,取几个字节,由指针类型决定的,指针为字符指针,则取一个字节,指针为整形指针则取4个字节,指针为double则取8个字节。
-
指针++ 指向下个对用类型的数据
-
字符指针++ 指向宪哥字符数据,指针存放的地址编号加1
-
整形指针++,指向下一个整形数据,指针存放的地址编号加4
指针和数组元素之间的关系
变量存放在内存中,有地址编号,咱们定义的数组,是多个相同类型的变量的集合,每个变量都占内存空间,都有地址编号
指针变量当然也可以存放数组元素的地址。
-
-
数组元素的引用方法
-
方法一:(数组名+下标)
-
int a[10];
-
a[2]=100;
-
-
方法二:(指针名+下标)
-
int a[10];
-
int *p;
-
p=a;//将a的地址保存在p里面。
-
p[2]=100;
-
-
-
补充: C语言规定:数组的名字就是数组的首地址,及第0个元素地址,是个常量。
-
注意:p和a的不同,p是指针变量,而a是个常量。所以可以用等号给p赋值,但不能给a赋值,tips:a相当于一个地址常量不能使用 a++。
-
方法三:(通过指针运算加取值的方法来引用数组的元素)
-
int a[10];
-
int *p;
-
p=a;
-
*(p+2)=100;//也是可以的相 当于a[2]=100 ,p是第0个元素的地址,p+2是a[2]这个元素的地址。
对第二个元素的地址取值,即a[2]
-
-
-
指针的运算
-
指针可以加一个整数,往下指几个它指向的变量,结果还是个地址。
前提:指针指向数组的时候,加一个整数才有意义。
-
两个相同类型的指针之间可以比较大小
-
只有两个相同类型指针指向同一个数组元素的时候,比价大小才有意义,指向前面元素的指针小于指向后面元素的指针。
-
两个相同类型的指针还可以做减法
前提:必须是两个相同类型的指针指向同一个数组元素的时候,做减法才有意义,做减法的结果是,两个指针指向的中间有多少的元素。
-
-
执行结果 3
-
两个相同的指针可以相互赋值
-
注意:只有相同类型的指针才可以相互赋值(void*类型的除外)
int *p;
int *q;
int a;
p=&a;
q=p;
-
注意:如果类型不相同指针想要赋值,必须进行强制类型转换。
-
注意:C语言规定数组的名字,就是数组的后地址,就是数组第0个元素的地址。
-
指针数组
-
指针和数组的关系
-
1.指针可以保存数组元素的地址
-
2.可以订购一个数组,数组中有若干个相同类型指针变量,这个数组被称为指针数组。
-
-
指针数组的概念:
-
指针数组本身是个数组,是个指针数组,是若干个相同类型指针变量构成的集合。
-
本质上就是一个数组。
-
指针数组的定义方法:
-
类型说明符 * 数组名[元素个数];
-
-
int * p[10]//定义了一个整型的之指针数组p,有10个元素p[0]~p[9],每个元素都是int * 类型的变量
-
int a ;
p[1]=&a;
int b[10];
p[2]=&b[3];
p[2]、*(p+2)是等价的,都是指针数组中的第二个元素,也就是b[3]的地址。
-
-
指针的指针---------二级指针
-
指针的指针,即指针的地址。
-
注意:p q m 都是指针变量,都占4个字节,都存放地址编号。
-
-
字符串的概念:
-
字符串就是以‘\0'结尾的若干字符串的集合。
-
字符串的存储形式:数组、字符串指针、堆。
-
1、char string[100] ="I Love C!"
-
定义了一个字符数组,string,用来存放多个字符,并且用"I Love C"给string数组初始化。
-
字符串"I Love C"存放在string中
char *str = "I love C!"
定义了一个指针变量str,只能存放字符地址编号。
所以说"I love C!"这个字符串中的字符,不能存放在str指针变量中。
str只是存放了字符I的地址编号,"I love C"存放在文字常量区
char *str =(char )malloc(10ziseof(char));//动态申请了10个字节的存储空间,首地址给str赋值。
strcpy(str,"I love C")//将字符拷贝到str指向的内存中。
-
-
字符数组:
-
在内存(栈,静态全局区)中开辟了一段空间存放字符串。
-
-
字符串指针:
-
在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给str
-
-
堆:
-
使用malloc函数在堆区中申请空间,将字符串拷贝到堆区。
-
-
注意:
-
可修改性:
-
栈和全局内存中的内容是可以修改的。
-
char str[100]= "I love C!";
-
str =‘y';//正确可以修改的
-
-
文字常量区的内容是不可以修改的
-
char *str="i love C!";
-
str ='y';//错误,i存放在文字常量区中,不可以修改。
-
-
-
-
数组指针
-
二二维数组,有行、有列。二维数组可以看成有多个一维数组构成的,是多个一维数组的集合,可以认为二维数组的每一个元素就是个一维数组。
-
例如:
-
int a[3] [5];
-
定义了一个三行五列的一个二维数组。
-
可以认为二维数组a由3个一维数组构成,每个元素是一个一维数组。
-
回顾:
-
数组的名字可以是数组的首地址,是第0个元素的地址,是个常量,数组名字加1指向下一个元素。(每个一维十足五个元素)
-
-
二维数组的数组名可以理解为行指针,即+1后指向下一行的首地址。
-
数值指针的概念:本事是一个指针,指向一个数值,加1跳一个数组,即指向下个数组。
-
数组指针的定义方法:
指向的数组类型 (*指针变量名)[指向数组到元素个数]
int (*p)
-