指针
为了有效使用内存,就把内存划分为一个个小单元,每个内存单元的大小是一个字节.为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号称为该内存单元的地址.
内存的使用类似于现实生活中对于空间的使用.
- 内存是如何编号的
- 32位:32位地址线
- 64位:64位地址线
- 一个内存单元的空间有多大
- 以一个字节作为一个内存单元
一个地址的例子
int main()
{
SetConsoleOutputCP(65001);
int a = 10;
printf("a的地址:%p\n",&a);
int * pa = &a ;//* 说明 pa 是指针变量; int 说明 pa 指向的对象是int类型的
printf("pa的值:%d\n",pa);
printf("pa的地址%p\n",&pa);
system("pause");
}
a的地址:000000000061fe1c
pa的值:6422044
pa的地址000000000061fe10
Press any key to continue . . .
用来存放地址的变量叫做指针变量
解引用操作符
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//* :解引用操作符
printf("%d\n",a);
system("pause");
}
20
请按任意键继续. . .
指针需要多大空间取决于地址的存储需要多大空间.32bit机器上就是32bit做地址,64bit机器就需要64bit(8)字节作为地址
int main()
{
printf("%d\n",sizeof(char*));
system("pause");
}
8
请按任意键继续. . .
结构体
结构体是C语言中很重要的知识点
结构体使得C语言能够描述复杂类型
下为一个例子
struct stu
{
char name[20];
int age;
double score;
};
struct book
{
char name[20];
float price;
char id[30];
};
int main()
{
SetConsoleOutputCP(65001);
struct stu s = {"张三",20,85.5};//结构体创建和初始化
printf("%s %d %f\n",s.name,s.age,s.score);
system("pause");
}
张三 20 85.500000
Press any key to continue . . .
分支和结构语句
顺序结构
就是一般的程序,没什么可写的
选择结构
if
语法结构
> if(表达式)
> 语句;
> if(表达式)
> 语句1;
> else
> 语句2;
> if(表达式1)
> 语句1;
> else if(表达式2)
> 语句2;
> else
> 语句3;
int main()
{
SetConsoleOutputCP(65001);
int num1 = 0;
scanf("%d", &num1);
if(num1<0)
printf("负数\n");
else if(num1=0)
printf("零\n");
else
printf("正数\n");
system("pause");
}
1
正数
Press any key to continue . . .
判断一个数是否为奇数
int main()
{
int num1 = 0;
SetConsoleOutputCP(65001);
printf("请输入一个数以供判断>");
scanf("%d",&num1);
if(num1%2==1)
printf("%d是奇数\n",num1);
else
printf("%d是偶数\n",num1);
system("pause");
}
输出1-100之间的奇数
int main()
{
int i = 1;
while( i <= 100)
{
if( i % 2 == 1 )
{
printf("%d\t",i);
}
i++;
}
system("pause");
}
int main()
{
int i = 0;
for(i = 1 ; i <= 100 ; i++)
{
if(i%2==1)
printf("%d\t",i);
}
system("pause");
}
switch
switch(整形表达式)
{
语句项;
}
int main()
{
int day = 1 ;
SetConsoleOutputCP(65001);
while(day != 0)
{
printf("请输入第几天>");
scanf("%d",&day);
switch (day)
{
case 1:
printf("今天星期一\n");break;
case 2:
printf("今天星期二\n");break;
case 3:
printf("今天星期三\n");break;
case 4:
printf("今天星期四\n");break;
case 5:
printf("今天星期五\n");break;
case 6:
printf("今天星期六\n");break;
case 7:
printf("今天星期日\n");break;
default:
printf("输入错误");
}
}
system("pause");
}
请输入第几天>1
今天星期一
请输入第几天>2
今天星期二
请输入第几天>3
今天星期三
请输入第几天>4
今天星期四
请输入第几天>5
今天星期五
请输入第几天>6
今天星期六
请输入第几天>7
今天星期日
请输入第几天>8
输入错误请输入第几天>0
输入错误Press any key to continue . . .
循环结构
while
while(表达式)
循环语句;
break
用于永久地终止循环
continue
跳过本次循环并从头开始
int main()
{
SetConsoleOutputCP(65001);
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s",password);
printf("请确认密码(Y/N:>)");
清理缓冲区
int tmp = 0;
while((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("Yes\n");
}
else
{
printf("No\n");
}
printf("密码为%s\n",password);
system("pause");
}
for
for(表达式1;表达式2;表达式3)
循环语句
//表达式1:初始化
//表达式2:判断
//表达式3:i调整
int main()
{
int i = 0;
for (i=1;i<10;i++)
{
printf("%d\t",i);
}
system("pause");
}
1 2 3 4 5 6 7 8 9 请按任意键继续. . .
for循环的初始化等式只执行一次
break和continue在for中
break会跳出循环体
continue不会跳出循环体,会回到if重新执行函数.
for循环中的一些建议
- 不可以在代码中修改循环变量,以免for循环失去控制
- 建议在for语句的循环控制变量的取值采用"前闭后开区间"的写法
错误代码示范
int main()
{
int i = 0;
for (i = 1; i <= 10 ; i++)
{
printf("%d",i);
int j = 0;
for (j = 0;j < 10 ; i++)
{
printf("in J\n");
}
}
system("pause");
}
for循环部分条件缺失
for循环任意部分可以单独或一起省略.但是判断部分的省略会导致死循环,所以应该慎重省略
do while
do
循环语句
while(表达式);
int main()
{
int i = 1;
do
{
printf("%d",i);
i++;
} while (i <= 10);
system("pause");
}
12345678910请按任意键继续. . .
计算n的阶乘
int main()
{
SetConsoleOutputCP(65001);
int i = 5 ;
int sum = 1;
printf("请输入n的值:>");
scanf("%d",&i);
do
{
sum = (sum * i);
i--;
} while(i > 1);
printf("n!=%d",sum);
system("pause");
}
计算1!+2!+…+n!
int main()
{
SetConsoleOutputCP(65001);
int i = 2;
int totsum = 1;
int sum = 1;
int n = 1;
printf("请输入i的值:>");
scanf("%d",&i);
do{
n=i;
sum = 1;
do{
sum = (sum * n);
n--;
}while(n>1);
i--;
totsum = (totsum + sum);
}while(i>1);
printf("1!+2!+...+i!=%d\n",totsum);
system("pause");
}
请输入i的值:>10
1!+2!+...+i!=4037913
Press any key to continue . . .
编辑代码演示只允许登录三次的程序