C語言筆記
指針
int p; (這時候代表后面的是地址變量)
-
p=5蔗包,p表示p只向村存儲的地址單元
- 指針變量就是地址變量
- 指針變量的定義:
int a=8食呻;
int *p售担;
p(地址變量)=&a(地址常量)勇吊;
- 指針變量的初始化:
int a;
int *p=&a顽决;
-
通過指針變量訪問內(nèi)容
p<===>(&a)<===>a短条;
int a=8;
//int*代表p是一個地址變量
int *p=&a;
//*這個是取P所代表的地址單元
*p=9;
printf("a=%d\n",a);
printf("*p=%d\n",*p);
printf("&a=%p\n",&a);
printf("p=%p\n",p);
printf("&p=%p\n",&p);//a=9,*p=9,&a=p=0x7fffdd706b64,&p=0x7fffdd706b68
-
數(shù)組與指針、
數(shù)組名就是首元素的地址a<===>&a[0]
a+i<===>&a[i]
int *p=&a[0]
p=&a[0]=a
p+i=&a[i]
*(p+i)=&a[i]=p[i]
- 如果想同時定義兩個指針變量:
int a[5]={1,2,3,4,5}; int i,j=0; int *p=a; *p=a[0]; for (i=0;i<3;i++) { j=p[i]; p[i]=p[4-i]; p[4-i]=j; } for (i=0;i<5;i++) { printf("%d",a[i]); } return 0;
int a=2,b=3,temp; int *p=&a,*q=&b; temp=*p; *p=*q; *q=temp; printf("%d",a); printf("%d",b);
-
只讀變量const:如果用一個const關(guān)鍵字去修飾一個變量才菠,標志著這個變量只讀茸时,不可更改。
const int a=9赋访;
int const a=9//都不可改
-
int a=9可都;
int const
p=&a缓待;(代表不能用P去改p所指向的存儲單元里的值)
*p=8為非法操作
int a,b汹粤;
int * const p=&a命斧;代表p一旦指向一個變量移后田晚,就不能改變p的指向
p=&b嘱兼;非法操作
-
一維數(shù)組與指針的關(guān)系
int arr[5]
int *p=arr
數(shù)組名就相當于首元素的地址
-
第i個元素地址訪問方法
p+i<===>&p[i]<===>arr+i<===>&arr[i]
-
第i個元素數(shù)值訪問方法
(p+i)<===>p[i]<===>(arr+i)<===>arr[i]
arr 實際上int const - *arr;表明arr永遠指向第一個元素贤徒,不能更改芹壕,就是說arr++非法
p++合法
-
函數(shù)
- 什么時候想到用函數(shù)
- 功能相同,而且這個功能需要使用多次
- 函數(shù)里的代碼盡量不要超過50 行
-
怎么定義函數(shù)
數(shù)據(jù)類型+函數(shù)名(形式參數(shù)列表)
{
}
1. 數(shù)據(jù)類型有:int接奈、float踢涌、double、char序宦、void(空類型)
- 函數(shù)定義注意點
1. 函數(shù)定義不允許放在主函數(shù)內(nèi)部
2. 函數(shù)定義必須放在使用之前睁壁,如果函數(shù)定義沒有放在主函數(shù)之前,解決方法如下:
- 將函數(shù)聲明寫在函數(shù)聲明之前
- 形參:
1. 形式上的參數(shù)互捌,沒有實際意義潘明。
2. 函數(shù)定義的時候,函數(shù)名()里面的參數(shù)叫形式參數(shù)
3. 形參在指定時要指定每一個參數(shù)的數(shù)據(jù)類型秕噪,不能省略钳降。比如:
void sum(int a,b)這種形式參數(shù)非法腌巾。
- 實參:
1. 有實際意義的參數(shù)遂填,參數(shù)里面是有確定值的。
2. 函數(shù)使用的時候澈蝙,函數(shù)名()里的參數(shù)吓坚。
- 實參的數(shù)量必須要與形參一致。
- return 的注意點:
- return是整個函數(shù)結(jié)束的標志
- 是將信息返回給函數(shù)調(diào)用者使用的
- return 使用注意點:
- void類型的函數(shù)結(jié)束時可以沒有return灯荧,也可以有return凌唬。如果有return,return后面沒有值漏麦。
- 如果是非void類型的(int客税,char....)函數(shù),函數(shù)結(jié)束時必須要有return撕贞,而且return后面必須要有值更耻,值得數(shù)據(jù)類型與函數(shù)定義類型必須保持一致。
- 傳參返回永遠都是數(shù)值
//使用函數(shù)捏膨,輸入一個年份輸入一個月份查詢?nèi)諝v
1990.1.1day1之后開始查詢秧均。
(year%4==0&&year%100食侮!=0)||(year%400==0)
計算1990.1.1到2016.8.31所有的天數(shù)
#include "stdio.h"
void leap(int *year,int *f,int *count);
void print(int day,int mouth,int f);
//int day_count(int *year,int *count);
//int day_count(int *year,int *f,int *count,int *mouth);
int main()
{
int day,year,f,fate,count=0,mouth,m=0,i;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
printf("請輸入一個年數(shù)");
scanf("%d",&year);
getchar();
printf("請輸入一個月份");
scanf("%d",&mouth);
leap(&year,&f,&count);
// day_count(&year,&f,&count,&mouth);
if(f==1)
{
for(i=0;i<mouth-1;i++)
m=m+b[i];
printf("該年是閏年\n");
}
if(f==0)
{
for(i=0;i<mouth-1;i++)
m=m+a[i];
printf("該年不是閏年\n");
}
day=(year-1990)*365+count+m;
printf("count的值為%d\n",count);
printf("f的值為%d\n",f);
printf("總天數(shù)為%d\n",day);
print(day,mouth,f);
return 0;
}
void print(int day,int mouth,int f)
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int last_num,s,i,j=0,t=0;
last_num=day%7;
if (f==0)
s=a[mouth-1];
if (f==1)
s=b[mouth-1];
printf("\n日 一 二 三 四 五 六\n");
for (i=1;i<=last_num+1;i++)
{
printf(" ");
}
for (i=last_num;i<6;i++)
{
j++;
printf("%02d ",j);
if(i==5)
printf("\n");
}
for (i=6-last_num+1;i<=s;i++)
{
t++;
printf("%02d ",i);
if(t%7==0)
printf("\n");
}
// for (i=1;i<=s;i++)
// {
// if (i%7==0)
// printf("\n");
// printf("%02d ",i);
// }
printf("\n上月最后一天為星期%d\n",last_num);
printf("本月天數(shù)為%d\n",s);
}
/*
int day_count(int *year,int *f,int *count,int *mouth)
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int day,m=0,i;
leap(&year,&f,&count);
if(*f==1)
{
for(i=0;i<*mouth-1;i++)
m=m+b[i];
printf("該年是閏年\n");
}
if(*f==0)
{
for(i=0;i<*mouth-1;i++)
m=m+a[i];
printf("該年不是閏年\n");
}
day=(*year-1990)*365+*count+m;
return day;
}*/
/*int day_count(int *year,int *count)
{
leap(&year,&f,&count);
int day=(*year-1990)*365+*count;
return day;
}*/
void leap(int *year,int *f,int *count)
{
int i;
for(i=1990;i<*year;i++)
{
if (((i%4==0&&i%100!=0)||(i%400==0))==1)
{
*count=*count+1;
}
}
// printf("%d\n",*count);
if (((*year%4==0&&*year%100!=0)||(*year%400==0))==1)
*f=1;
else
*f=0;
}