C语言复习4+练习(2018.11.20)

指针
指针变量的值是一个地址。
变量的指针就是变量的地址。存放变量地址的变量是指针变量。

其一般形式为:
类型说明符 *变量名;
eg:int *p;
指针变量初始化的方法
int a;
int *p=&a;
赋值语句的方法
int a;
int *p; p=&a;

指针变量可出现在表达式中,设 
int x,y,*px=&x;
指针变量 px 指向整数 x,则*px 可出现在 x 能出现的任何地方。
例如:
 y=*px+5;  //表示把 x 的内容加 5 并赋给 y
 y=++*px;  //px 的内容加上 1 之后赋给 y,++*px 相当于++(*px)
 y=*px++;  //相当于 y=*px; px++

eg:
输入 a 和 b 两个整数,按先大后小的顺序输出 a 和 b。

int main() 
{ 
	int *p1,*p2,*p,a,b;
	scanf("%d,%d",&a,&b);   
	p1=&a;p2=&b;   
	if(a<b)     
	{
		p=p1;p1=p2;p2=p;
	}   
	printf("\na=%d,b=%d\n",a,b);
	printf("max=%d,min=%d\n",*p1, *p2);
	return 0; 
}

指针变量作为函数参数

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将 一个变量的地址传送到另一个函数中。
eg:
输入的两个整数按大小顺序输出。今用函数处理,而且用指 针类型的数据作函数参数。

swap(int *p1,int *p2) 
{
	int temp;  
	temp=*p1;  
	*p1=*p2;  
	*p2=temp; 
} 
int main() 
{  
	int a,b; 
	int *pointer_1,*pointer_2;   
	scanf("%d,%d",&a,&b);   
	pointer_1=&a;pointer_2=&b;   
	if(a<b)
	{
	 	swap(pointer_1,pointer_2); 
	}  
	printf("\n%d,%d\n",a,b);  
	return 0; 
}

输入 a、b、c3 个整数,按大小顺序输出。

swap(int *pt1,int *pt2) 
{
	int temp;  temp=*pt1;  
	*pt1=*pt2;  
	*pt2=temp; 
} 
exchange(int *q1,int *q2,int *q3) 
{ 
	if(*q1<*q2)swap(q1,q2); 
	if(*q1<*q3)swap(q1,q3);
	if(*q2<*q3)swap(q2,q3); 
} 
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("\n%d,%d,%d \n",a,b,c);
	return 0;   
} 

指针变量的运算
赋值运算:指针变量的赋值运算有以下几种形式。
① 指针变量初始化赋值
② 把一个变量的地址赋予指向相同数据类型的指针变量。
int a,*pa;
pa=&a; //把整型变量 a 的地址赋予整型指针变量 pa
③ 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。
int a,*pa=&a,*pb; pb=pa; //把 a 的地址赋予指针变量 pb
由于 pa,pb 均为指向整型变量的指针变量,因此可以相互赋值。
④ 把数组的首地址赋予指向数组的指针变量。
int a[5],*pa;
pa=a;
(数组名表示数组的首地址,故可赋予指向数组的指针变量 pa) 也可写为: pa=&a[0];
// 数 组 第 一 个 元 素 的 地 址 也 是 整 个 数 组 的 首 地 址,也可赋予 pa
当然也可采取初始化赋值的方法:int a[5],*pa=a;
⑤ 把字符串的首地址赋予指向字符类型的指针变量。
char *pc;
pc=“C Language”;
或用初始化赋值的方法写为:
char *pc=“C Language”; 这里应说明的是并不是把整个字符串装入指针变量,而是把存放该字符串的字符数 组的首地址装入指针变量。在后面还将详细介绍。 ⑥ 把函数的入口地址赋予指向函数的指针变量。
例如: int (*pf)(); pf=f; //f 为函数名

加减算术运算

int a[5],*pa;     
pa=a;      //pa 指向数组 a,也是指向 a[0] 
pa=pa+2;   //pa 指向 a[2],即 pa 的值为&pa[2] 

两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进行运算,否则 运算毫无意义。

练习:
有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用数组完成

#include <stdio.h>

int main()
{
    int a[100];
    int n,i,num;
    int flag = 0;    //flag为找退出人的记号
    printf("输入人数:\n");
    scanf("%d",&n);
    num = n;
    for(i = 0; i < n;i++)
    {
        a[i] = 1;//使n个人的值为1。1为存在,0为不存在
    }
    i = 0;
    while(n > 1)//循环到剩下一个人为止
    {
        if(a[i] != 0)
        {
            flag++;
        }
        if(flag == 3)//找到为三的人
        {
            a[i] = 0;
            flag = 0;
            n--;//退出一个人n-1
        }
        i++;
        if(i == num)//因为是围圈数人,所以数到第n个人时,下一个为第一个
        {
            i = 0;//回到圈头
        }
    }
    
    for(i = 0;i < num; i++)//寻找最后存在的那个人在第几号
    {
        if(a[i] != 0)
        {
            printf("余下的人号数为:%d\n",i+1); //因为数组是从0开始,所以要+1。
        }
    }

    return 0;
}

结果:
在这里插入图片描述

请编程找出1000以内的完数

#include <stdio.h>

int main()
{
    int i,j,temp;
    int k = 0;
    printf("1000内的完数为:\n");
    for(i = 2;i < 1001; i++)
    {
        temp = 0;
        for(j = 1;j <= (i / 2); j++)
        {
            if(i % j == 0)//找出因数
            {
                temp = temp + j;//因数相加
            }
        }
        if(temp == i)
        {
            printf("%d\t",i);
        }
    }
    printf("\n");
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值