11-指针
一、 指针前奏
1. 指针的重要性
指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
2. 小需求
l void change(int n)函数调用完毕后,改变实参的值
l 分析:修改实参的值->找到存储空间->地址
二、 指针变量的定义
1. 定义的格式
l 类名标识符 *指针变量名;
l int *p;
2. 先定义后赋值
l 简单取值
int a = 10;
int *p;
p = &a;
printf(“%d”, *p);
l 简单改值
*p = 9;
3. 定义的同时赋值
int a = 10;
int *p = &a;
4. 实现修改实参
5. 注意点
- int *p; p = 1000;
- int *p; *p = 100;
- int *p; *p = &a;
- %p输出指针里面存储的地址值
- 其他指针类型说明,比如float *p; char *p;
- 不能乱用类型,比如int a = 10; float *p = &a;
6. 清空指针
l p = 0;
l p = NULL;
7. 指针小结
变量类型 变量名;
格式:变量类型 *变量名;
定义了一个指针变量p
指针变量只能存储地址
指针就一个作用:能够根据一个地址值,访问对应的存储空间
指针变量p前面的int:指针变量p只能指向int类型的数据
三、 指针实例
- void swap(char *a, char *b) (注意temp=a; a = b; b = temp;
#include <stdio.h> void swap(int *v1, int *v2); int main() { /* int a = 10; int b = 11; swap(&a, &b); */ int a2 = 90; int b2 = 89; swap(&a2, &b2); printf("a2=%d, b2=%d\n", a2, b2); return 0; } /* 不能交换外面实参的值,仅仅是交换了内部指针的指向 void swap(int *v1, int *v2) { int *temp; temp = v1; v1 = v2; v2 = temp; }*/ // 完成两个整型变量值的互换 void swap(int *v1, int *v2) { int temp = *v1; *v1 = *v2; *v2 = temp; } /* 交换的只是内部v1、v2的值 void swap(int v1, int v2) { int temp = v1; v1 = v2; v2 = temp; }*/
2.int sumAndMinus(int a, int b, int *minus)
#include <stdio.h>
int sumAndMinus(int n1, int n2, int *n3);
int main()
{
int a = 10;
int b = 7;
// 存储和
int he;
// 存储差
int cha;
c
he = sumAndMinus(a, b, &cha);
printf("和是%d, 差是%d\n", he, cha);
return 0;
}
// 返回值是
int sumAndMinus(int n1, int n2, int *n3)
{
*n3 = n1 - n2;
return n1 + n2;
}
四、 指针探究
- 指针变量所占用的存储空间
- 为何指针变量要分类型?
int i = 2;
char c = 1;
int *p = &c;
printf(“%d”, *p);
五、 指针与数组
1. 指向一维数组元素的指针
2. 用指针遍历一维数组元素
l 先遍历char数组(‘i’,’t’),再遍历int类型数组
l *(p+i)和*(p++)的区别
l a+i和a++
l p[0]、p[1]
六、 指针与字符串
1. 字符串回顾
char s[] = “mj”;
2. 其他定义字符串的方式
char *s = “mj”;
或者
char *s;
s = “mj”;
3. 两种定义方式的区别
l 内存分析
l 画图分析
l 常量和变量字符串的区别
l 常量的内存地址查看
4. 习题
1> 编写一个int string_len(char *s),返回字符串s的字符长度
七、 返回指针的函数
l 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
l 返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
八、 指向函数的指针
1. 为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2. 指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3. 使用注意
l 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
l 指向函数的指针变量主要有两个用途:
- 调用函数
- 将函数作为参数在函数间传递
4. 存放特点
1.常量区
存放一些常量字符串
2.堆
对象
3.栈
存放局部变量
掌握:
定义字符串的2种方式
1> 利用数组
char name[] = "whb";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "whb";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
浙公网安备 33010602011771号