《c语言指针学习笔记》由会员分享,可在线阅读,更多相关《c语言指针学习笔记(23页珍藏版)》请在金锄头文库上搜索。
1、指针的用处:指针的用处: 指针可以一种简洁的方式访问一个大的数据结构。指针可以一种简洁的方式访问一个大的数据结构。 指针可以使不同程序间的数据共享更方便。指针可以使不同程序间的数据共享更方便。 指针可以在程序执行时留出内存空间。指针可以在程序执行时留出内存空间。 指针可以记录各数据项之间的关系。指针可以记录各数据项之间的关系。 算术运算符复乘法、除法、取模在指针运算中没有意义,所以在指针运算中是非法的。另外,加减运算在指针去处运算中也是受限制的。C 语言中,指针可以加或减一个整数,但是不能加另一个指针,减是唯一可以在指针间运算的算术运算符。如: p1-p2 其中 p1 和 p2 都是指针, 该
2、表达式返回当前两个指针 p1 和 p2 之间的数组元素个数。例如:若 p1 指向 list2,p2 指向 list0,那么该表达式 p1-p2 的值为 2,因为在两个指针之间具有两个元素。 指针和指针变量指针和指针变量 指针是一个地址,而指针变量是存放地址的变量。 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 变量的指针是变量的地址,存放变量地址的变量是指针变量,它用来指向另一个变量。 在程序中“*”表示指向。 指针变量指针变量 定义指针变量的一般形式: 基类型基类型 * *指针变量名指针变量名; ; 指针变量作为函数参数指针变量作为函数参数 #include void swa
3、p(int *p1,int *p2); void main() int *pointer_1, *pointer_2, a, b; scanf(“%d,%d“, pointer_1= pointer_2= if(a void main() int *p, i, a10; p=a; for (i=0;ip。 3) *(p+)与*(+p)作用相同。前者是先取*p 值,然后使 p加1。 后者是先使p加1.再取*p。 若p初值为a(即/第一种方法:形参为数组名 /void inv(int *x, int n);/第二种方法:形参为指针变量 void main() int i, a10=3,7,9,11
4、,0,6,7,5,4,2; printf(“The original array:n“); for(i=0;i /void Sort(int x,int n);/方法一 void SortAnother(int *x, int n);/方法二 void main() int *p, i, a10; p=a;/指针变量指向数组的首元素地址 for(i=0;ixk) k=j; if (k!=i) t=xi; xi=xk; xk=t; void SortAnother(int *x, int n)/方法二:形参为指针变量 int i, j, k, temp; for (i=0;i*(x+k) k=j
5、; if (k!=i) temp=*(x+i); *(x+i)=*(x+k); *(x+k)=temp; 数组 a 的性质 表示形式 含义 地址 a 二维数组名,指向一维数组 a0,即 0 行首 地址 2000 a0,*(a+0),*a 0 行 0 列元素地址 2000 a+1, void search(float (*p)4, int n); void searchLow(float (*p)4, int n); void main() float score34=65,67,70,60,80,87,90,81,90,99,100,98; average(*score,12); search
6、(score,2); searchLow(score,3); void average(float *p, int n) float *p_end; float sum=0,aver; p_end=p+n-1; for (;p void copy_string(char from, char to); void copy_string2(char *from,char *to); void main() char from=“I am a teacher“; char to=“Yor are a student“; char *a=from, *b=to; printf(“string a=%
7、snstring b=%sn“,a,b); printf(“copy string a to string b:n“); copy_string(a,b); printf(“nstring a=%snstring b=%sn“,a,b); void copy_string(char from, char to)/形参为数组名 int i=0; while(fromi!=0) toi=fromi; i+; toi=0; void copy_string2(char *from,char *to)/形参为指针变量 for (;*from!=0;from+,to+) *to=*from; *to=0
8、; 字符指针变量和字符数组字符指针变量和字符数组 1、 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的中地址 (字符串第 1 个字符的地址) , 决不是将字符 中放到字符指针变量中。 2、 赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值: 错误:char str14; str=”I love China!” ; 而对字符指针变量,可以采用下面方法赋值: char *a;a=”I love China!” ; 3、 对字符指针变量赋初值: char *a = “I love China!” ; 等价于 char *a;a=”I love China!
9、” ; 而对数组的初始化: char str14 = “I love Chian!”;不等价于 char str14;str = “I love China!”; 4、 如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。例如: char str10;scanf(“%s”,str);是可以的, char *a;scanf(“%s”,a);也能运行,但是这种方法是危险的,决不提倡的;应当这样:
10、char *a,str10;a=str;scanf(“%s”,a); 先使 a 有确定值,也就是使 a 指向一个数组的首元素,然后输入一个字符串,把它存放在以该地址开始的若干单元中。 5、 指针变量的值是可以改变的,如: void main() char *a = “I love China!” ; a = a + 7; printf(“%s”,a); 6、 指针变量指向一个格式字符串, 可以用它代替 printf 函数中的格式字符串。如: char * format; format=” a=%d,b=%fn” ; printf(format,a,b); 指向函数的指针指向函数的指针 说明:
11、1、 指向函数的指针就是的一般定义形式为: 数据类型 (* 指针变量名) (函数参数列表) ; 2、 函数的调用可以通过函数名调用, 也可以通过函数指针调用 (即用指向函数的指针变量调用) 3、 “int (* p)(int,int); ”表示定义一个指向函数的指针变量 p,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的 , 它是专门用来用来存放函数的入口地址的。 在程序中把哪一个函数(该函数的值应是整型的,且有两个整型参数)的地址赋给它,它就是指向哪一个函数。在一个程序中,一个指针变量可以先后指向同类型的不同函数。 4、 在给函数指针变量赋值时, 只需要给出函数名而不必给出参数,
12、例如: p = max; 因为是将函数入口地址赋给 p,而不牵涉实参与形参的结合问题。不能写成 p = max(a,b); 5、 用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名) ,在(*p)之后的括号中根据需要写上实参。例如: c = (*p)(a,b); 表示 “调用由 p 指向的函数, 实参为 a、 b。 得到函数值赋给 c” 。 6、对指向函数的指针变量,像 p+n、p+、p等运算是无意义的。 用指向函数的指针作函数的参数用指向函数的指针作函数的参数 它的原理可以简述如下:有一个函数(假设函数名为 sub) ,它有两个形参(x1,x2) ,定义 x1 和 x2
13、为指向函数的指针变量。在调用函数sub 时,实参为两个函数名 f1 和 f2,给形参传递的是函数 f1 和 f2的地址。这样在函数 sub 中就可以调用 f1 和 f2 函数了。例如: 实参函数名 f1 f2 void sub (int (*x1)(int),int (*x2)(int, int) int a, b, i, j; a=(*x1)(i);/调用 f1 函数 b=(*x2)(i,j);/调用 f2 函数 例 1:设一个函数 process,在调用它的时候,每次实现不同的功能。输入 a 和 b 两个数,第一次调用 process 时求出 a 和 b 中大者,第二次找出其中小者,第三次
14、求 a 与 b 之和。 #include /函数声明,不可少。 int max(int, int); int min(int, int); int add(int, int); void process(int,int,int (*fun)(int,int); void main() int a, b; printf(“Please enter a and b:n“); scanf(“%d,%d“, printf(“max=“); process(a,b,max); printf(“min=“); process(a,b,min); printf(“sum=“); process(a,b,ad
15、d); int max(int x, int y) int z; if(xy) z=x; else z=y; return z; int min(int x, int y) int z; if(xy) z=y; else z=x; return z; int add(int x, int y) int z; z=x+y; return z; void process(int x,int y,int (*fun)(int,int) int result; result=(*fun)(x,y); printf(“%dn“,result); 在定义 process 函数时,在函数首部用“int(*fun)(int,int)”表示fun 是指向函数的指针,该函数是一个整型函数,有两个整型形参。max、min 和 add 是已定义的 3 个函数,分别用来实现求大数、小数、和求和的功能。 在 main 函数中第一次调用 process函数时, 除了将 a 和 b 作为实参,将两个整数传给 process 的形参 x、y 外,还将函数名 max 作为实参将其入口地址传送给process函数中的形