#include<stdio.h>intmain(){int a =100, b =10; //定义整型变量a,b,并初始int*point_1,*point_2; //定义指向整型数据的指针变量point_1,point_2 point_1 =&a; //把变量a的地址赋给指针变量point_1 point_2 =&b;printf("a=%d,b=%d\n", a, b);printf("*point_1=%d,*point_2=%d\n",*point_1,*point_2);return0;}-----a=100,b=10*point_1=100,*point_2=10
怎么定义指针变量
类型名 * 指针变量名
指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在.
怎样引用指针变量
1)给指针变量赋值
p=&a;
指针变量p的值是变量a的地址,p指向a.
2)引用指针变量指向的变量.
printf("%d",*p);
以整数形式输出指针变量p所指向的变量的值,即变量a的值.
3)引用指针变量的值
printf("%d",p);
以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址,&a.
输入a和b两个整数,按先大后小的顺序输出。
#include<stdio.h>intmain(){int a, b,*point_a,*point_b,*temp;printf("please enter two integer number:");scanf("%d,%d",&a,&b); point_a =&a; point_b =&b;if (a < b) { temp = point_b; point_b = point_a; point_a = temp; }printf("a=%d,b=%d\n", a, b);printf("max=%d,min=%d\n",*point_a,*point_b);}
指针变量作为函数参数
✔️ 输入a和b两个整数,按先大后小的顺序输出。
#include<stdio.h>intmain(){int a, b,*point_a,*point_b;voidswap(int*point_a,int*point_b);printf("please enter two integer number:");scanf("%d,%d",&a,&b); point_a =&a; point_b =&b;if (a < b)swap(point_a, point_b);printf("max=%d,min=%d\n",*point_a,*point_b);}voidswap(int*point_a,int*point_b){int temp; temp =*point_a;*point_a =*point_b;*point_b = temp;}----------------//如果写成:int*temp;*temp =*point_a;//此语句有错误,不能向一个未知的存储单元赋值. point_a =*point_b; point_b =*temp;
#include<stdio.h>intmain(){int i, a[10];printf("please enter 10 integer numbers:");for (i =0; i <10; i++)scanf("%d",&a[i]);for (i =0; i <10; i++)printf("%d", a[i]);printf("\n");return0;}
2)通过数组名计算数组元素地址,找出元素的值
#include<stdio.h>intmain(){int i, a[10];printf("please enter 10 integer numbers:");for (i =0; i <10; i++)scanf("%d",&a[i]);for (i =0; i <10; i++)printf("%d\t",*(a + i));printf("\n");return0;}
3)用指针变量指向数组元素
#include<stdio.h>intmain(){int a[10],*p;printf("please enter 10 integer numbers:");for (p = a; p < (a +10); p++)scanf("%d", p);for (p = a; p < (a +10); p++)printf("%d\t",*p);printf("\n");return0;}
#include<stdio.h>intmain(){voidinv(int[],int);int i, a[10];printf("please enter original array:\n");for (i =0; i <10; ++i)scanf("%d",&a[i]);inv(a,10);printf("The array has been inverted:\n");for (i =0; i <10; ++i)printf("%d\t", a[i]);return0;}voidinv(int arr[],int n){int i, j,temp,m=(n-1)/2;for (i =0; i < m; ++i) { j = n -1- i; temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; }}
指针变量作形参:
#include<stdio.h>intmain(){voidinv(int[],int);int i, a[10];printf("please enter original array:\n");for (i =0; i <10; ++i)scanf("%d",&a[i]);inv(a,10);printf("The array has been inverted:\n");for (i =0; i <10; ++i)printf("%d\t", a[i]);return0;}voidinv(int*arr,int n){int*p,*i,*j, temp, m = (n -1) /2; i = arr; //头部的指针位置 j = arr + n -1;//末尾的指针位置 p = arr + m; //中值的指针位置for (; i <= p; ++i, j--) { temp =*j;*j =*i;*i = temp; }return;}
#include<stdio.h>intmain(){voidsort(int[],int);int i, a[10];printf("please enter original array:\n");for (i =0; i <10; ++i)scanf("%d",&a[i]);sort(a,10);printf("The array has been sorted:\n");for (i =0; i <10; ++i)printf("%d\t", a[i]);return0;}voidsort(int arr[],int len){int i, j, temp, max;for (i =0; i < len -1; ++i) { max = i;for (j = i +1; j < len; ++j) {if (arr[j] > arr[max]) max = j;if (max != i) { temp = arr[i]; arr[i] = arr[max]; arr[max] = temp; } } }}
#include<stdio.h>intmain(){int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};int (*p)[4], i, j; p = a;printf("please enter row and colum:");scanf("%d,%d",&i,&j);printf("a[%d,%d]=%d\n", i, j,*(*(p + i) + j));printf("\n");return0;}
#include<stdio.h>intmain(){voidaverage(float*,int);voidsearch(float (*p)[4],int);float score[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};average(*score,12);//*转换为列指针变量search(score,2);return0;}voidaverage(float*p,int n){float*p_end;float sum =0, aver; p_end = p + n -1;//指向最后一个元素for (; p <= p_end; p++) sum += (*p); aver = sum / n;printf("%5.2f\n", aver);}voidsearch(float (*p)[4],int n){int i;printf("the score of No.%d are:\n", n);for (i =0; i <4; ++i)printf("%5.2f\n",*(*(p + n) + i));}
#include<stdio.h>intmain(){voidcopy_string(char from[],char to[]);char a[]="I am a teacher.";char b[]="You are a student.";printf("string a:%s\nstring b:%s\n", a, b);printf("copy string a to string b:\n");copy_string(a, b);printf("string a:%s\nstring b:%s\n", a, b);return0;}voidcopy_string(char from[],char to[]){int i;while (from[i] !='\0') { to[i] = from[i]; i++; } to[i] ='\0';}
复制后的数组仍存在没有被覆盖的值(t, .,\0);
用%s格式输出时,遇到第一个\0后面的字符就不会输出了.
如果用%c逐个字符输出是可以输出后面这些字符的.
2)用字符型指针变量作实参
#include<stdio.h>intmain(){voidcopy_string(char from[],char to[]);char a[]="I am a teacher.";char b[]="You are a student.";char*from = a;char*to = b;printf("string a:%s\nstring b:%s\n", a, b);printf("copy string a to string b:\n");copy_string(from, to);printf("string a:%s\nstring b:%s\n", a, b);return0;}voidcopy_string(char from[],char to[]){int i;while (from[i] !='\0') { to[i] = from[i]; i++; } to[i] ='\0';}
3)用字符指针变量作形参和实参
#include<stdio.h>intmain(){voidcopy_string(char from[],char to[]);char*a ="I am a teacher.";char b[]="You are a student.";char*p = b;printf("string a:%s\nstring b:%s\n", a, b);printf("copy string a to string b:\n");copy_string(a, p);printf("string a:%s\nstring b:%s\n", a, b);return0;}voidcopy_string(char*from,char*to){for (; *from !='\0'; ++from,++to) {*to =*from; }*to ='\0';}//精简voidcopy_string(char*from,char*to){while ((*to =*from) !='\0') {++from,++to; }*to ='\0';}//再精简voidcopy_string(char*from,char*to){while ((*to++=*from++) !='\0');*to ='\0';}//voidcopy_string(char*from,char*to){while (*from !='\0') {*to++=*from++; }*to ='\0';}// ASCII码voidcopy_string(char*from,char*to){while (*from) {*to++=*from++; }*to ='\0';}//还可以简化为while (*to++=*from++); 等价于while ((*to++=*from++) !='\0');//forfor (; *to++=*from++;); 或者for (; (*to++=*from++)!='\0';);
char*format; format ="a=%d,b=%f\n";printf(format, a, b);
这种printf函数称为可变格式输出函数.
指向函数的指针
每次调用函数时都会从函数分配的内存空间的起始地址开始执行此段函数代码。
函数名代表函数的起始地址.
可以定义一个指向函数的指针变量,用来存放某一函数的起始地址.这就意味着此指针变量指向该函数.
int (*p)(int,int);
用函数指针变量调用函数.
用函数求a和b中的大者.
#include<stdio.h>intmain(){intmax(int,int);int (*p)(int,int);int a, b, c; p = max;printf("please enter a and b:");scanf("%d,%d",&a,&b); c = (*p)(a, b);printf("max is:%d", c);return0;}intmax(int x,int y){return x > y ? x : y;}
#include<stdio.h>intmain(){intmax(int,int);intmin(int,int);int (*p)(int,int);int a, b, c, d;printf("please enter two integer:\n");scanf("%d,%d",&a,&b);printf("please choose 1 or 2:\n");scanf("%d",&c);if (c ==1) p = max;elseif (c ==2) p = min; d = (*p)(a, b);if (c ==1)printf("max is:%d", d);elseprintf("min is:%d", d);return0;}intmax(int x,int y){return x > y ? x : y;}intmin(int x,int y){return x < y ? x : y;}
#include<stdio.h>intmain(){intmax(int,int);intmin(int,int);intsum(int,int);intfun(int,int,int (*p)(int,int));int a, b, c, d;printf("please enter two integer:\n");scanf("%d,%d",&a,&b);printf("please choose 1 , 2 or 3:\n");scanf("%d",&c);if (c ==1)fun(a, b, max);elseif (c ==2)fun(a, b, min);elseif (c ==3)fun(a, b, sum);return0;}intfun(int x,int y,int (*p)(int,int)){int result; result = (*p)(x, y);printf("%d\n", result);}intmax(int x,int y){printf("max=");return x > y ? x : y;}intmin(int x,int y){printf("min=");return x < y ? x : y;}intsum(int x,int y){printf("sum=");return x + y;}