第五讲 指针 其他类型
A.指针类型
1.指针提供了一种用来使用地址的符号的方法,由于计算机的指令硬件很大程度上要依赖于地址,所以指针使您以类是计算机底层的表达方式来表示自己的意识。数组名同时是该数组首元素的地址。也就是说,如果age是一个数组,那么下面的是对的;
age = &age[0]; //数组名就是数组首元素的地址。
指针变量的定义:
//格式:变量类型 *变量名
//指针就是用于存储地址的。仅仅能存储地址而已
//64bit编译器中,指针分配的是8字节存储空间
Int *p;
Int a = 90;
P = &a; //把a元素的地址给了P。继而P中存放的是a元素的地址
//上面三行代码过后,在内存中的分配是:
//*p的意识是:访问p中存放的存储空间地址的值。
*p = 10;
//经过这样赋值后a原来是90,现在a的值已经是10。
2.指针的认识
a.在C中,对一个指针加1的结果是对该指针增加1个存储单元,对于数组而言,地址会增加到下一个元素的地址。
b.指针保存的数值就是它所指向的对象的地址。地址的内部表示方式由硬件来决定,都是以字节编址的。这意味者要对每个内存字节顺序进行编号,比如double类型的数据,对象的地址通常指的是其首字节的地址。
c.在指针前运用运算符*就可以取得到该指针所指向的对象的值。
d.下面的等式体现了C指针的优点;
date + 2 = = &date[2] /*相同的地址*/
*(date + 2) == date[2] /*相同的值*/
e.*(date + 2)的意思是:寻址到内存中的date,然后移动2个单位(移动2 x 类型所占内存字节数),再取出数值。
3.函数形参数改变实参数据
//函数过程是:在主函数运行是,分配给一定内存给主函数,在运行int a = 90;时,在主函数的内存中分配内存给a并且保存了数据90.在运行函数调用change(int n)时,跟函数change分配一定的内存,并且给形参变量也分配内存。在调用的时候形参内存中保存的值为90。
接下来在执行change函数中赋值 n = 10; 后,n的值从90变成了10。
//如果要改变变量的值,必须传递地址才可以。
//下面在传递的时候可以同时获取函数中的两个值。利用指针变量获取实参数的值,再通过返回值获取另外一个值。
//指针使用注意点
//不建议的写法,int *p只能指向int类型的数据
Int *p;
Double k = 10.0;
P = &k;
//指针变量只能存储地址
Int *p;
P = 200;
//指针变量未经初始化,不要拿来间接访问其他的存储空间
Int *p;
Printf(“%d”, *p);
4.指向指针的指针
5.不同类型指针所占字节数
Char c; //1
Int a; //4
Long b; //8
//在64bits编译其状态下指针占用8字节,在32bits中指针可能占用4字节。
Char *cp; //8
Int *ap; //8
Long *bp;//8
Printf(“cp = %zd ap = %zd bp = %zd”,sizeof(cp), sizeof(ap), sizeof(bp)) ;
a.指针为什么会分类型
//以下打印出来c = 1;(变量c和指针是同种类型变量)
char c = 1;
char *cp;
p = &c;
printf(“c = %d”, *p);
//下面这种情况就不同了,输出结果就变成了513了。
char c = 1;
int*cp;在这个地方修改了。
p = &c;
printf(“c = %d”, *p);
//用表格来表示指针内部存储显示形式。
Int *p代表在内存中分配8个字节存储。在接下来p =&c;可以知道,指针p存储的是c的地址,那么接下来指针所指向的就是从ffc5开始读取8个字节数据。继而*p的二进制表示就是0000 0000 0000 0000 0000 0010 0000 0001。所以指针和需要给指针的变量必须是同种类型,这样在读取的时候,就不会出现内存套用的情况了。
6.指针和数组、字符串
a.指针和数组
Int age[] = {10, 8, 7, 56, 45, 78};
Int *p;
//指针变量指向数组首元素地址
P = &age[0];
//同样也可以这样写
P = age;
//这块代码在内存中的表现形式是;
b.指针和字符串
//这样写字符串为变量
char name[] = “it”;
//”it” = ‘i’ + ‘t’ + ‘\0’
//指针变量name2指向字符串的首字符,这样定义的是字符串常量
Char *name2 = “it”;
//在内存中的表现形式为:分为:常量区、堆、栈中;
常量区:存放一些常量字符串
堆:存放对象
栈:存放局部变量、数组、字符串变量
//以下字符串保存在同一个地址,这样表明他们是常量
//定义字符串可以用两种方式来实现
7.返回指针的函数
//指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
//返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
//函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
//由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
//指向函数的指针变量主要有两个用途:
//调用函数
//将函数作为参数在函数间传递