一、指针前奏
1.指针的重要性
· 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
2.需求
· voidchange(int n)函数调用完毕后,改变实参的值
· 分析:修改实参的值->找到存储空间->地址
二、指针变量的定义
1.定义的格式
· 类名标识符 *指针变量名;
· int *p;
2.先定义后赋值
· 简单取值
o int a = 10;
o int *p;
o p= &a;
o printf(“%d”, *p);
· 简单改值
o *p = 9;
3.定义的同时赋值
· inta = 10;
· int*p = &a;
4.实现修改实参
·
· #include<stdio.h>
·
· voidchange(int *n);
·
· intmain()
· {
· int a = 90;
·
· change(&a);
·
· printf("%d\n", a);
·
· return 0;
· }
·
· voidchange(int *n)
· {
· *n = 10;
· }
5.使用注意
· 不建议的写法, int *p只能指向int类型的数据
o int *p;
o double d = 10.0;
o p = &d;
· 指针变量只能存储地址
o int *p;
o p = 200;
· 指针变量未经过初始化,不要拿来间接访问其他存储空间
o int *p;
o printf("%d\n", *p);
· 定义变量时的*仅仅是一个象征,没有其他特殊含义
· 这个时候的*的作用:访问指向变量p指向的存储空间
o *p = 20;
· %p输出指针里面存储的地址值
6.清空指针
· p= 0;
· p= NULL;
三、指针实例
1.voidswap(char *a, char *b) (注意temp=a; a = b; b = temp;)
· #include<stdio.h>
·
· voidswap(char *a, char *b);
·
· intmain()
· {
· char a = 'A',b = 'B';
·
· swap(&a,&b);
·
· printf("%c %c\n", a,b);
·
· return 0;
· }
·
· voidswap(char *a,char *b)
· {
· *a = *a - *b;
· *b = *a + *b;
· *a = *b - *a;
· }
2.int sumAndMinus(int a, int b,int *minus)
· #include<stdio.h>
·
· intsumAndMinus(int a, int b, int *minus);
·
· intmain()
· {
· int a = 10;
· int b = 20;
· int minus;
·
· int sum = sumAndMinus(a,b,&minus);
·
· printf("和为%d,差为%d\n",sum,minus);
·
· return 0;
· }
·
· intsumAndMinus(int a, int b, int *minus)
· {
· *minus = a - b;
· return a + b;
· }
四、指针研究
1.指针变量所占用的存储空间
· 8个字节
2.为何指针变量要分类型?
· inti = 2;
· charc = 1;
· int*p = &c;
· printf(“%d”, *p);
五、指针与数组
1.指向一位数组元素的指针
2.用指针遍历一位数组元素
· 先遍历char数组(‘i’,’t’),再遍历int类型数组
· *(p+i)和*(p++)的区别
· a+i和a++
· p[0]、p[1]
3.习题
· 设计一个函数:int arraySum(int a[], int n),求一维数组a前n个数的和。现在利用int *p替换inta[]
o #include<stdio.h>
o
o intarraySum(int *p, int n);
o
o intmain()
o {
o int a[]={1,2,3,4,5,6};
o
o int sum = arraySum(a,5);
o
o printf("%d\n",sum);
o
o return 0;
o }
o
o intarraySum(int *p, int n)
o {
o int sum = 0;
o for (int i = 0; i<n; i++) {
o sum = sum + *(p+i);
o }
o return sum;
o }
六、指针与字符串
1.字符串回顾
· chars[] = “mj”;
2.其他定义字符串的方式
· char *s="mj";
· char *s; s = "mj";
3.两种定义方式的区别
· 内存分析
· 画图分析
· 常量和变量字符串的区别
· 常量的内存地址查看
4.补充
· 1.常量区
· 存放一些常量字符串
·
· 2.堆
· 对象
·
· 3.栈
· 存放局部变量
·
· 掌握:
· 定义字符串的2种方式
· 1> 利用数组
· char name[] = "itcast";
· * 特点:字符串里面的字符是可以修改的
· * 使用场合:字符串的内容需要经常修改
·
· 2> 利用指针
· char *name = "itcast";
· * 特点:字符串其实是一个常量字符串,里面的字符是不能修改
· * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
4.习题
· 编写一个int string_len(char *s),返回字符串s的字符长度
o #include<stdio.h>
o #include<string.h>
o intstring_len(char *s);
o
o intmain()
o {
o char a[] = "itcast123123123";
o
o int longth = string_len(a);
o
o printf("%d\n",longth);
o
o return 0;
o }
o
o intstring_len(char *s)
o {
o return strlen(s);
o }
七、返回指针的函数
· 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
· 返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
o 例:
o #include<stdio.h>
o char*test();
o
o intmain()
o {
o char *name = test();
o
o printf("name=%s\n", name);
o
o return 0;
o }
o
o char*test()
o {
o return "rose";
o }
八、指向函数的指针
1.为什么指针可以指向一个函数
· 函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2.指向函数的指针的定义
· 定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3.使用注意
· 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
· 指向函数的指针变量主要有两个用途:
o 调用函数
o 将函数作为参数在函数间传递
4.实际用法
· 掌握:
· 1.看懂语法
· 2.定义指向函数的指针
· double (*p)(double, char *, int);
· p = haha;
· 或者
· double (*p)(double, char *, int) = haha;
· 3.如何间接调用函数
· 1> p(10.7, "jack", 10);
· 2> (*p)(10.7, "jack", 10);