------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
第一讲 指针的基本概念
一、基本概念
内存单元的编号叫做地址。 //根据内存单元的编号或地址就可以找到所需的内存单元,所以通常把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。
总结:对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。
二、使用指针好处
a.为函数提供修改调用变量的灵活手段。
b.让函数有多个返回值。 //简易计算器
1 #include<stdio.h> //定义一个函数,有加,减,乘,除 2 void caculator(int x,int y, int *add , int *jian , int *cheng, float *chu){ 3 //在函数的内部访问了主调函数中的变量值 4 //加法指针变量表达式 5 *add = x + y; 6 7 //减法指针变量表达式 8 *jian = x - y; 9 10 //乘法指针变量表达式 11 *cheng = x * y; 12 13 //除法指针变量表达式 14 *chu = x /(float)y; 15 16 } 17 int main(int argc, const char * argv[]){ 18 19 // 定义一个指针变量,并初始化 20 int *add = 0; 21 int *jian = 0; 22 int *cheng = 0; 23 float *chu = 0; 24 25 //调用calculator这个函数 26 caculator(12,4,&add,&jian,&cheng , &chu); 27 printf ("add = %d\n",add); 28 printf ("jian = %d\n",jian); 29 printf ("cheng = %d\n",cheng); 30 printf ("chu = %d\n",chu); 31 return 0; 32 }
c.可以改善某些子程序的效率。
>>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内容。
d.为动态数据结构(如二叉树、链表)提供支持。
三、变量的存取方式
存取方式分为两种:直接存取和间接存取 。
直接存取:变量的赋值和取值(通过变量名进行存取值 int a = 3; int b=a;)
间接存取: 通过指针(地址)间接操作完成。
第二讲 指针变量概念及定义方法
一、指针变量的概念
指针是一个地址,是一个常量。
指针变量是存放一个地址,是一个变量。(用一个变量来存放指针或存放指针(地址)的一个变量);存放变量的地址;
一个指针变量的值就是某个内存单元的地址或成为某内存单元的指针。
二、定义一个指针变量
对指针变量的定义包括三个内容:
1)指针类型说明,即定义变量为一个指针变量;
2)指针变量名;
3)变量值(指针);
其一般形式为:
数据类型(类型说明符) *指针变量名;
三、指针变量定义的注意事项
1."*" 必须得有,如果没有相当于定义一个普通变量。
2. 指针变量能用来存放数值或者字符之类的吗? 不能。
3. 一个类型的指针只能指向同一个类型的变量,不能指向其它类型的变量。
1 int num = 10; //定义一个常量num ,并初始化值为10 2 3 //定义一个指针变量p,并指向num的地址 4 int *p = #
4.指针变量,归根结底还是变量,也有全局和局部变量之分。
//指针变量的使用:定义指针变量 -----> 初始化指针变量 -----> 使用(使用指针变量间接的存取内存单元的值)
//指针变量如果不初始化会有什么后果?
结论: 如果一个指针变量定义以后,如果不进行初始化, 这个指针变量存放的是一个垃圾数,这个指针变量,称之为 野指针。
//一定要避免操作野指针,因为可能会带来意想不到的错误
int *p10; //值是一个垃圾值,有可能存放的是系统程序的地址
*p10 = 438; //可能会造成系统崩溃
p10 = &a;
四、指针变量的初始化和引用
1 //指针变量如何进行初始化? 指针变量应该用地址初始化 2 3 //定义两个变量,并且给变量进行初始 4 int a =4,b =5; 5 6 //先定义变量,然后在初始化变量值 7 int a1; 8 a1 = 10; 9 10 //1)定义的同时进行初始化 11 1.完全初始化 12 int *p = &a; //用a 的地址 初始化 p这个指针变量 13 //另外一种描述方法: p指向了 a (a的地址给了p) 14 2.部分初始化 15 16 int *p3 = &b, *p4; //定义了两个指针变量 p3 p4 17 p4 = &b; 18 19 3.如果定义了一个指针变量,但是我不知道让这个指针指向谁 20 21 int *p5 = NULL; // NULL是空(0) 22 int *p6 =0; //空 23 24 // 把一个指针赋值一个空,什么也不值 25 26 //常见的易犯的错误 27 int *p8 = 1000; //杜绝 28 29 //2)先定义后初始化 (最好不这么用) 30 int *p7 ; 31 p7 = NULL; 32 33
// *指针变量 作用: 获取指针变量指向的内存空间的内容
int value = *p1; //获取指针变量的值所对应的存储单元
//给指针变量指向的内存单元赋值
*p1 = 100; // 设定值
value = *p1; // 100
// "*" 的两种用法
//1)用于定义一个指针变量
存储指针变量指向的储存空间的内容
五、指针和指针变量的区别:
1.指针是一个地址(地址是不能变的),是一个常量。
2.指针变量是存放一个地址,是一个变量。(存放地址的变量)
第三讲 应用:用函数实现两变量值交换
思考&实现:
用函数实现两个变量值的交换。
1 #include <stdio.h> void swap(int *p, int *p1){ 2 3 //定义一个变量 4 int temp; 5 6 //交换两变量的值 7 temp = *p; 8 *p = *p1; 9 *p1 = temp; 10 11 } 12 int main (int argc, const char * argv[]){ 13 14 //定义两个变量 15 int a=4,b=5; 16 printf("交换前:a = %d ,b=%d",a,b); 17 18 // 调用swap函数 19 swap(a,b); 20 printf("交换后:a = %d,b= %d",a,b); 21 22 return 0; 23 }
第四讲 指针常见的应用场景
一、指针常见的应用场景
1 int a =10; 2 int *p = &a; 3 *p = 100; 4 int b = *p;
1)在被调函数中可以修改主调函数中的变量的值
1 /* 2 定义了一个函数 3 在函数内部通过指针变量修改指针变量指向的内容 4 p 指针变量 5 */ 6 #include <stdio.h> 7 void changValue(int *p){ 8 9 *p = 100; 10 } 11 int main(int argc , const char * argv[]){ 12 int a = 1; 13 int *p1 = &a; //p1指向了a 14 15 printf("%p\n",&a); //地址 16 printf("%p\n",p1); 17 18 changValue(p1); 19 20 printf("%d\n",*p1); //100 21 printf("%d\n",a); 22 return 0; 23 }
2)让函数可以有多个返回值
//并不是有多个return
//简易计算器
第五讲 二级指针
一、二级指针介绍
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为"二级指针"
1 #include <stdio.h> 2 3 int main(int argc , const char * argv[]){ 4 5 int a = 5; 6 7 //定义一个指针变量 8 int *p = &a ; 9 printf("p = %p\n",p); 10 printf("&a =&p\n",&a); 11 12 //定义一个二级指针 13 // ** 的个数 等于 级数 14 int **p1 = &p; 15 printf(" &p = %p\n",&p); 16 printf(" p1 = %p\n",p1); 17 18 printf(" *p = %d\n",*p); 19 //p的值 , a 的地址 20 printf(" *p1 = %p\n",*p1); 21 printf(" **p1 =%d\n", **p1); //5 22 23 return 0; 24 }
//指针为什么要区分类型
结论:定义什么类型的指针就应该指向什么类型的变量。 //不能乱指 ,要不然不是指多了就是指少了。读多读少都不对。
来源:https://www.cnblogs.com/xiaokang520/p/5062323.html