指针(一)

来源:互联网 发布:js随时检测窗口大小 编辑:程序博客网 时间:2024/05/22 01:27

用指针交换大小

#include<stdio.h>int main(){ int a,b,*p1,*p2,*p3; scanf("%d,%d",&a,&b);//注意这里规定输入有, 则必须输入的形式为45 p1=&a; p2=&b; if(a<b) {p3=p1;p1=p2;p2=p3;}  printf("%d,%d",a,b);  printf("%d %d",*p1,*p2);  return 0;}

用指针变量作函数参数大小排序

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void swap(int *p1, int*p2)//注意若引用该函数,则就是交换顺序,不需要再次比较大小{    int temp;//不能使用int*temp;因为*temp赋值就是向一个未知存储单元赋值,而该位置存储单元可能存有有用的数据        temp = *p1; *p1 = *p2; *p2 = temp;}void exchange(int*p1,int*p2,int*p3){    if (*p1 < *p2) swap(p1,p2);//注意这里比较的是整数的大小而不是地址的大小    if (*p1 < *p3) swap(p1, p3);    if (*p2 < *p3)swap(p2, p3);}int main(){    int a, b, c, *p1, *p2, *p3;    scanf("%d%d%d", &a, &b, &c);    p1 = &a; p2 = &b; p3 = &c;//表达式皆用分号,即使在同一行    exchange(p1, p2, p3);    printf("%d,%d,%d", a, b, c);    return 0;}

通过指针引用数组
通过指针引用数组元素

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){    int a[10],i,*p=a;//int*p=a;相当于int*p;p=a;    for (i = 0; i < 10; i++)        scanf("%d", p++);//当循环结束p=a+10    for (i = 0, p = a; i < 10; i++)//所以当下个循环开始时,应该把p重新初始化为a        printf("%d  ", *p++);//++和*优先级相同,根据结合方式为自右向左,他等价于*(p++),先引用*p,再自加    return 0;                //若p初始为p=a+3;则p+1为a+4}

用数组名作函数参数

用数组名或指针变量做形参能改变实参的值。用变量名作形参,不能改变实参的值。
fun(int arr[],int n);等价于fun(int*arr,int n);

将数组a中n个整数按相反顺序存放

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void inv(int*p,int n){    int i, temp;    for (i = 0; i <= (n - 1) / 2;i++)    {        temp = *(p + i); *(p + i) = *(p + n - i - 1); *(p + n - i - 1) = temp;//注意    }}int main(){    int a[10] = { 3,7,9,11,0,6,7,5,4,2 }, i,*p=a;inv(p,10);for (i = 0; i < 10; i++)    printf("%d ", *p++);return 0;}

用指针方法对10个整数按由小到大顺序排序

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define N 100void sort(int*p, int n){    int i, j, temp, k;//注意定义temp,而不是*temp;    for (i = 0; i < n - 1; i++)//注意i,j的范围    {        k = i;        for (j = i + 1; j < n; j++)            if (*(p + k) < *(p + j))            {                temp = *(p + k); *(p + k) = *(p + j); *(p + j) = temp;            }    }}int main(){    int a[N], *p = a, i=0, n=0;    do { scanf("%d", p + i);///*******    i++;                    ///*******    } while ((getchar()) != '\n');///*******注意在输入元素时,并不知道输入的个数,可以通过检验空格是否为回车而检验                 /////////////////////////////////////是否输入结束,并计数    n = i;//元素的总数    sort(p, n);    for (i = 0; i < n; i++)        printf("%d ", *(p + i));    return 0;}

通过指针引用多维数组
在二维数组中a[10][5],其中a[0]只是一个地址并不是某个元素的值。
a,a+i,a[2],(a+i), (a+i)+j,a[i]+j,都是地址
*(a+i)等价于a[i]
**int (*P)[4]=a,p+1一次跳4个
int*p=a[0];一次跳一个**

指向多维数组元素的指针变量

有一个3*4二维数组,用轴向元素的指针变量输出二维数组的各个元素
方法一

**#define _CRT_SECURE_NO_WARNINGS****#include<stdio.h>**int main(){    int a[3][4],m; int(*p)[4]=a;//int*p)[4]表示p为一个指针变量,他指向**包含4个整型元素的一维数组**,注意括号必不少    //[]的级别高,所以必须加括号。    int i, j,s,t;    for (i = 0; i < 3; i++)    {        for (j = 0; j < 4; j++)        {            scanf("%d", (*(p + i) + j));            }        }    for (i = 0; i < 3; i++)    {        for (j = 0; j < 4; j++)        {            printf("%d ", *(*(p + i) + j));           }        printf("\n");    }    scanf("%d%d", &s, &t);    m = *(*(p + s) + t);    printf("%d\n", m);return 0; }

方法二

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){int a[3][4], i, j, *p = a[0];//一次跳一个,指针指向数组元素for (p = a[0]; p < a[0] + 12; p++)//不可以p<p+12;因为p一直在变    scanf("%d", p);for (p = a[0]; p < a[0] + 12; p++)//不可以p<p+12;因为p一直在变{    printf("%d ", *p);    if ((p+1 - a[0])%4 == 0)//四个一行        printf("\n");}scanf("%d%d", &i, &j);printf("%d", *(a[0] + i * 4 + j));//一次跳一个return 0;}
#include<stdio.h>int main(){int a[4]={1,3,5,7};int(*p)[4];p=&a;printf("%d\n",(*p)[3]);return 0;

以上程序中p=&a;表示p指向一维数组(行),(*p)[3]表示指向的行中的序号为三的元素。若p=a,则表示p的值为&a[0],指向a[0]
int(p)[4]的类型为int()[4]

用指向数组的指针作函数参数:
两种方法:①指向变量的指针 形参void sss(int*p);实参sss(*arr)
②指向一维数组的指针void sss(int(*p)[4]) 实参sss(p)

一个班三人四课计算总平均分以及第n个学生的成绩。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>void average(int(*p)[4], int i, int j)//注意只有两种形式{    float ave[4] = { 0 }, *q = ave;//数组初始化需要带花括号{},不能直接写ave[4]=0;    int n = 0;    for (i = 0; i < 3; i++)    {        for (j = 0; j < 4; j++)        {            if (*(*(p + i) + j) < 60) n++;            (*(q + i)) = *(*(p + i) + j) + (*(q + i));//不要搞混        }        if (n >= 2) {            printf("第%d个学生有一门以上课程不及格\n", i + 1);            for (j = 0; j < 4; j++)                printf("%d ", *(*(p + i  ) + j));            printf("\n");        }        (*(q + 3)) = (*(q + i)) + (*(q + 3));    }    printf("总平均分为:%.2f\n", ((*(q + 3)) / 12));//注意应该除以12    for (i = 0; i < 3; i++)        printf("第%d个学生的平均分为:%.2f\n", i + 1, (*(q + i)) / 4);}int main(){    int score[3][4], (*p)[4] = score, i, j, n;    for (i = 0; i < 3; i++)    {        for (j = 0; j < 4; j++)            scanf("%d", *(p + i) + j);    }    average(p, 3, 4);    printf("查找第几个学生:\n");    scanf("%d", &n);    printf("第%d个学生的成绩为:", n);    for (i = 0; i < 4; i++)        printf("%d ", *(*(p + n - 1) + i));    printf("\n");    return 0;}`

用指针引用字符串

字符串的引用方式

#include<stdio.h>int main(){char*string="I love China";//注意是双引号 printf("%s",string); printf("%c",*(string+7));//注意 return 0;

复制
法一:

#include<stdio.h>int main(){    char a[] = "kk and wenwen", b[20];    int i;    for (i = 0; *(a + i) != '\0'; i++)        *(b + i) = *(a + i);    *(b + i) = '\0';//因漏下而出错,循环只有在不是回车的时候才复制,所以需要重新写一行    printf("%s\n", a);    printf("%s",  b);    return 0;}

指针法
见指针(二)

0 0