今天一天结束了C语言指针的学习,当然对于我们计院专业的学生来说这无疑是一堂查漏补缺课程,即使课程很快,但是一旦认真下来,平复自己的心情,还是会学到不少东西的。
****************************************************************************************************************************************
指针(对今天指针所学内容进行一个大致的概括:):
1.指针定义与使用
2.指针运算
3.指针与数组(一维数组、二维数组)
4.多级指针(指针的指针)
5.指针数组
6.字符串、字符指针数组
7.指针函数
8.函数指针
9.const与指针
10.void指针
细节概要:
- 指针的定义与运用:
- 定义一个指针时,最好初始化p=NULL;,否则指针就会为空,其会随机指向任何地方,有可能会造成严重的影响;
- 一些重要的指针运用:a=*p+1 取值,值加一
a=++(*p) 取值,值加一
a=(*p)++ 取值,值加一
a= ++*p 取值,值加一
a= ++(*p)取值,值加一
a=*p++ 取值,指针加一
a=*++p 指针先加一,取值
a=*(p+1) 指针先加一,取值
*(*(a+i)+j) == a[i][j]
- 指针运算
1.指针做加1或者减1运算代表指向下一个int类型的数据或者前一个int类型的数据,指针指向的位置是当前地址加上 sizeof(int),或者当前地址减去sizeof(int)
2.指针之间可以做减法运算,前提是两个指针类型一致,指向同一数据元素(比如指向同一数组)
减法的含义代表两个指针之间元素的个数;
- 指针与数组(一维数组、二维数组)
- *(*(q+i)+j) = a[i][j]
- *(a+i) = a[i]
-
指针和数组常见等价操作:(一维数组)
指针操作 数组操作 说明
p &a[0] 数组首地址
*p a[0] 数组的第一个元素
p+i &a[i] 数组的第i个元素的地址
*(p+i) a[i] 数组的第i个元素
*p+b a[0]+b 数组的第一个元素的值加b
*(p+i)+b a[i]+b 数组的第i个元素的值加b注:当前p指向第i个元素
*p++ a[i++] 先取得数组的第i个元素的值,i加1//先取得数组的第i个元素的值,指针p再加一,指向a[i+1]
*++p a[++i] 先i加1,取得数组的第i+1个元素的值,//指针p先加一,指向a[i+1],再取得数组的第i+1个元素的值
*p-- a[i--] 先取得数组的第i个元素的值,i减1//先取得数组的第i个元素的值, 指针p再减一,指向a[i-1]
*--p a[--i] 先i减1,取得数组的第i-1个元素的值,//指针p先减一,指向a[i-1],再取得数组的第i-1个元素的值 -
二维数组:&a[0][0] == a 值一样,含义不一样
&a[0][0]表示数组首地址,列地址
a表示数组首地址,行地址
- 多指针(指针的指针级)
- int **p;
理论上多级指针最多可以到12级别,实际上2级指针用的多
- int **p;
- 指针数组
- int *p[10];
char *a[20];
p是一个指针数组,数组的名字是p,数组有10个元素,每一个元素值都是一个指向整形数据的指针 - int (*p)[10]的区别,这是一个指针,指针的名字是p,指向一个含有10个元素的整形数组
- int *p[10];
- 字符串、字符指针数组
-
C语言本身没有字符串类型,用字符数组来表示字符串(约定最后一个字符是'\0');
char a[10]="Welcome";
char *s="Welcome";
s="hello";对
a="hello";错 -
下方有课后作业实现了字符型指针数组实现程序主菜单!!!!
-
-
指针函数
-
定义:若一个函数返回的是指针,则称该函数为指针函数
-
函数内部的变量都是局部变量,当函数执行完后,会自动释放,在主调函数中不能再访问,访问一段释放的内存,是非法操作,若修改非法内存中的值,可能会出现严重后果,不可预料。
-
第二条的解决方法如下:
1. 用static将局部变量变为静态局部变量
2. 字符串常量类似于静态变量,在程序结束时,才释放内存。函数中使用 char *str="Welcome"; "Welcome"是一个常量,在内存中有确定的地址,把这个地址返回给主调函数是可以的
3. 在堆空间分配内存,返回分配内存的地址给主调函数。str=(char *)malloc(20);
注意:堆空间的使用一定要注意使用后要释放。 malloc / free 一定是对应的,如果不释放,指针已经指向其他地方, 此空间成为内存泄漏空间。
-
-
函数指针
-
函数指针是一个专门用于保存函数首地址的指针,实际上就是函数的入口地址。
-
实例:int (*p)(int,int);
-
-
const与指针
-
const int *p;与int const *p;的区别与理解;
-
区别与理解:把数据类型去掉const int *p->const *p 说明*p是常量,即p指针指向的内存空间的整形值不允许更改
把数据类型去掉int * const p-> * const p 说明指针p是常量,即p指针不能改变;
-
-
void指针
-
void*
void指针不是空指针,而是一种不确定数据类型的指针,可以通过强制类型转换将void型指针转换为任何类型的指针。 -
举例:
void *malloc(size_t size);char a[20]
a=(char *)malloc(sizeof(a));int b[20]
b=(int *)malloc(sizeof(b));
-
课后练习部分:
1.统计随机数的分布,产生10000个以上的10以内随机数,统计0~9出现的次数,保存在数组里。
2.编写字符串逆序函数,不借助于任何字符串函数,使用指针完成。
3.编写返回的指针的函数,不借助于任何字符串函数实现字符串的拷贝,返回目的字符串指针。
4.编写返回的指针的函数,不借助于任何字符串函数实现字符串的连接,返回目的字符串指针。
5.用字符指针数组实现主程序的menu()菜单。
第一题:
第二题:
第三题:
第四题:
第五题:
Everything is OK` QAQ
****************************************************************************************************************************************
按照这节奏是要一星期上完一年的C语言课程呀!(哈哈哈~~~)
忙碌的时光总是过得很快;快乐的时光也总会过的很快;
马上就要复习链表部分了,内心还是有点小激动的~~~~
加油!相信自己~ YOHO~