C语言复习7

指针:

C语言程序运行中,变量或程序代码被存放在以字节为单位组织的存储器中。一般以变量所在的内存单元的第一个字节的地址作为它的地址;

指针变量定义:

类型名 *指针变量名

* 为指针声明符,也可作为间接访问运算符。

指针赋值:

指针之间的相互赋值只能在相同类型的指针之间进行,指针之间也可以相互赋值,可以用初始化了的指针变量给另一个指针变量作初始化。不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针

指针赋值中,p=0等价于p=NULL;

指针运算:

在C语言中,指针的算术运算只包括两个相同类型的指针相减以及指针加上或减去一个整数。

设p和q为指针变量

p-q=p和q之间的数组元素的个数

若加上(int )型的强制类型转换

(int)p - (int) q=指针p与指针q之间的字节数

#include<stdio.h>
int main(void)
{
	int *p;
	int a[10];
	int i,n;
	long int  sum;
	printf("please enter your number:");
	scanf("%d",&n);
	printf("please enter number(%d):",n);
	
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sum=0;
	for(i=0;i<n;i++)
	{
		sum=sum+a[i];
		
	}
	printf("the sum is %d\n",sum);
	
	sum=0;
	for(p=a;p<a+n;p++)
	{
		sum=sum+*p;
	}
	
	printf("the sum is %d\n",sum);
	
	return 0;
	 
 } 

数组与指针:

数组名本身便是一个指针

*(a+1)等价于a[i]

且在函数定义中,数组的形参a实际上是一个指针。当进行参数传递,主函数传递数值a的基地址时,编译器允许在作为参数声明的指针中使用数组方括号。

/冒泡排序/
#include<stdio.h>
#define MAXN 10
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void)
{
	int n,a[MAXN];
	int i;
	printf("enter n(n<10):");
	scanf("%d",&n);
	printf("enter %d integers:",n);
	
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	bubble (a,n);
	printf("after sorted:"); 
	for(i=0;i<n;i++)
	{
		printf("%3d",a[i]);
	}
	
	return 0;
}

void bubble(int a[],int n)
{
	int i,j;
	for(i=1;i<n;i++)
	{
		for(j=0;j<n-i;j++)
		{
			if(a[j]>a[j+1])
			{
				swap(&a[j],&a[j+1]);
			}
		}
	}
}

void swap (int *px,int *py)
{
	int t;
	t=*px;
	*px=*py;
	*py=t;
	
}
 

冒泡函数分析:

每一次大循环,便会确定一个数的位置,例如:

 

利用二分法可以进行函数优化,让数组分成两部分,则当数据庞大时可以简化运行时间;

#include<stdio.h>
#define MAXN 10
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void)
{
	int a[MAXN];
	int b[MAXN]={};
	int c[MAXN]={};
	int i,n,j,x,y;
	
	printf("please enter your number n:");
	scanf("%d",&n);
	
	printf("please enter %d number:",n);
	
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	j=a[n/2];
	
	x=0;
	y=0;
	for(i=0;i<n;i++)
	{
		if(a[i]<j)
		{
			
			b[x]=a[i];
			x++;
		}
		else
		{
			c[y]=a[i];
			y++;
		}
	}
	
		
	
	bubble(b,x);
	bubble(c,y);
	printf("after sorted:");
	for(i=0;i<x;i++)
	{
		printf("%3d",b[i]); 
	}
	for(i=0;i<y;i++)
	{
		printf("%3d",c[i]);
	}
}


void bubble(int a[],int n)
{
	int i,j;
	for(i=1;i<n;i++)
	{
		for(j=0;j<n-i;j++)
		{
			if(a[j]>a[j+1])
			{
				swap(&a[j],&a[j+1]);
			}
		}
	}
}

void swap (int *px,int *py)
{
	int t;
	t=*px;
	*px=*py;
	*py=t;
	
}
 
 

利用指针,可以很好的解决函数返回值的问题:

#include<stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);

int main(void)
{
	int day,month,year,yearday;
	printf("input year and yearday: ");
	scanf("%d%d",&year,&yearday);
	month_day(year,yearday,&month,&day);
	printf("%d-%d-%d\n",year,month,day);
	
	return 0;
}

void month_day(int year,int yearday,int *pmonth,int *pday)
{
	int k,leap;
	int tab[2][13]={{0,31,28,31,30,31,30, 31 ,31, 30, 31, 30, 31},{0,31,29,31,30,31,30,31,31,30,31,30,31 }}; 
	
	leap=(year%4==0&&year%100!=0||year%400==0);//C语言中真为1,假为0, 
	
	for(k=1;yearday>tab[leap][k];k++)
	{
		yearday-=tab[leap][k];//依次减去月的天数,从而确认日和月 
	}
	*pmonth=k;
	*pday=yearday;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值