------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
第一讲 指针
一.指针的基本概念
在计算机中,所有的数据都是存放在存储器中的,一般把存储器的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型占4个单元,字符量占1个单元等。为了正确的访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确的找到该内存单元。内存单元的编号也叫做地址,根据内存单元的编号或地址就可以找到所需的内存单元,所以通常又把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。
例:账号是内存地址;卡里存的钱是实际内容。
二.使用指针的好处
1. 为函数提供修改调用变量的灵活手段
2. 让函数有多个返回值
3. 可以改善某些子程序的效率
4. 在数据传递时,如果数据快较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
5. 为动态数据结构(如二叉树/链表)提供支持。
三.变量的存取方式
变量的存取方式分为:直接存储和间接存储
int a=3;
1. 直接存储:变量的赋值和取值(通过变量名进行存取值)
例如:int b=a;
2. 间接存储:通过指针(地址)间接操作完成。
第二讲 指针变量的定义及概念
一.指针变量的概念
在C语言中允许用一个变量来存储指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元地址或称为某内存单元的指针。
注意:
严格意义上说:指针是一个地址,是一个常亮。
指针变量是存放一个地址,是一个变量。
二.定义指针变量
对指针变量的定义包括三个内容:
1. 指针类型说明,即定义变量为一个指针变量;
2. 指针变量名;
3. 变量值(指针)
其一般形式为:类型说明符 *变量名;
其中*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如:
int *p; //定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址
char *p1; //定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址
在定义指针时,“*”号表示定义的变量是指针变量,变量的值只能存放地址。
1. 一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
2. 指针也可以被声明为全局,静态局部和局部的。
第三讲 指针变量的初始化和指针应用场景
一.指针变量的初始化
指针变量的使用: 定义指针变量 ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)。
指针变量应该用地址进行初始化。
1.定义的同时初始化
//定义两个变量,并且给变量进行初始 a = 4, b = 5
int a=4,b=5;
(1)完全初始化
int *p = &a; //用a的地址初始化 p这个指针变量(p指向了a)
(2)部分初始化
int *p3 = &b,*p4; //定义了两个指针变量 p3 p4
p4 = &b;
2.先定义后初始化
int *p7;
p7 = &a;
注意:
如果一个指针变量定义以后,如果不进行初始化,这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针。一定要避免操作野指针,因为可能会带来意向不到的错误。
二.指针的应用场景
1.在被函数中可以修改主调函数中的变量的值
/**
* 定义了一个函数
* 在函数内部通过指针变量修改指针变量指向的内容
*/
void changeValue(int *p){
*p = 100;
}
int main(int argc, const char * argv[]) {
int a=1;
int *p1=&a;
changeValue(p1);
printf("%d\n",a);
}
2.让函数可以有多个返回值,并不是有多个return
void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){
//在函数的内部访问了主调函数中的变量值
*add = x+y;
*jian = x-y;
*cheng = x*y;
*chu = x/(float)y;
}
int main(int argc, const char * argv[]) {
int add=0;
int jian=0;
int cheng=0;
float chu=0.0f;
caculator(12, 4, &add, &jian, &cheng, &chu);
printf("add = %d\n",add);
printf("jian = %d\n",jian);
printf("cheng = %d\n",cheng);
printf("chu = %.2f\n",chu);
return 0;
}