指针
内存
如何产生地址 32 位 32根地址线/数据线 正电 - 1 负电 - 0
00000000000000000000000000000000
......
11111111111111111111111111111111
共2^32个地址 2^32bit = 0.5gb
2^32 byte = 4gb
&取地址符号
int main()
{
int a = 10;//4个字节
int* p = &a;//& - 取地址 int* p - 指针变量用来存放地址
//printf("%p\n",p);
*p = 20;//* - 解引用操作符/间接访问操作符 可直接找到原a进行使用
printf("%d\n",a);
//有一种变量是用来存放地址的 - 指针变量
//printf("%p\n",&a);
return 0;
}
0x0012ff40
int a = 10; --> 10 a
int* p = &a;--> 0x0012ff40 p 32位一个指针字节的大小为4个字节 64位 8个字节
*p = 20;用*解引用操作符直接使用a
int main()
{
char ch = 'w';
char* pc = &ch;
printf("%d\n",sizeof(pc));
*pc = 'a';
printf("%c\n",*pc);
return 0;
}
结构体 char int double ...
复杂对象 - 结构体 - 我们自己创造出来的一种类型
struct - 结构体关键字
struct Book//创建一个结构体类型
{
char name[20];//c语言程序设计
short price;//55
};// ; - 不可缺少,结构体结束标志
int main()
{
struct Book b1 = {"c语言程序设计",55};
strcpy(b1.name,"c++");//strcpy - string copy - 字符串拷贝
printf("%s\n",b1.name);
struct Book* pb = &b1;
//利用pb打印出我的书名和价格
//. 结构体变量.成员 -> 结构体指针->成员
printf("%s\n",pb->name);
printf("%d\n",pb->price);
printf("%s\n",(*pb).name);
printf("%d\n",(*pb).price);
printf("书名:%s\n",b1.name);
printf("价格:%d元\n",b1.price);
return 0;
}
分支和循环语句
c语言是一门结构化的程序设计语言
1.顺序结构 2.选择结构 3.循环结构
分支语句 if switch 循环语句 while for do while
c语言中由一个;号隔开即为一个语句
if语句
if(表达式) 语句;
if(表达式) 语句1;else 语句2;
if(表达式) 语句1; else if(表达式) 语句2; else 语句3;
int main()
{
int age = 10;
if(age<18)
{
printf("未成年\n");
printf("不能谈恋爱\n");
}
else if(age>=18 && age<23)
printf("青年\n");
//...
else
printf("老年\n");
return 0;
}
if语句条件成立后要使多条内容成立需用{}语句块
悬空else
int main()
{
int a = 0;
int b = 0;
if(a == 1);
if(b == 2)
printf("呵呵\n");
else//else对齐上列if的位置不影响程序运行结果,正确运行顺序为第一个if是否成立后才进入第一个if else语句
//else匹配上离它最近的if
printf("哈哈\n");
return 0;
}
书写规范,常量和变量判断是否相等,将常量放左边
输出0-100中的奇数
int main()
{
int a = 1;
while (a<100)
{
if(a%2 == 1)
printf("%d ",a);
a++;
}
return 0;
}
判断一个数是否为奇数
int main()
{
int a = 0;
scanf("%d",&a);
if( a%2 == 1 )
printf("奇数\n");
else
printf("偶数\n");
return 0;
}
switch语句 实现多分支
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)//只决定从哪个case进入开始程序 switch只能定义整型(整型表达式)
{
case 1://case 后接整型常量表达式
printf("星期一\n");
break;//break - 在此语句case 1停止 - 跳出语句
case 2:
printf("星期二\n");
break;
//...
}
return 0;
}
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
//default和case无顺序,按书写规范则按顺序书写
}
return 0;
}
循环语句
while(表达式)
循环语句;
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;//循环停止 continue - 返回循环初,从此处后while中代码不再执行
printf("%d",i);
i++;
}
return 0;
}
getchar
int main()
{
int ch = getchar();
putchar(ch);
printf("%c\n",ch);
//putchar等价于此时的printf
return 0;
}
int main()
{
int ch = 0;
//ctrl + z
//EOF - end of file - -1
while((ch=getchar()) !=EOF)
{
putchar(ch);
}
int main()
{
int ret = 0;
int ch = 0;
char passward[20] = {0};
printf("请输入密码:>");
scanf("%s",passward);//输入密码,并存放在passward数组中
//输入函数后,输入的数据会被保存到输入缓冲区,例如"123456"
//此时缓冲区内容为"123456\n",当scanf取走缓冲区中的"123456"时,getchar只能接收
//缓冲区中的"\n",侧if语句中else成立,程序输出放弃确认
while((ch = getchar()) !='\n')
{
;
}
//getchar();//获取掉"\n"
printf("请确认(y/n):>");
ret = getchar();//y/n
if(ret == 'y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
//ascii 10 = \n
}
return 0;
}
只输出数字字符
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
{
if(ch<'0'||ch>'9')
continue;
else
putchar(ch);
}
return 0;
}
for循环
for(表达式1;表达式2;表达式3;) - 1初始化部分 2条件判断部分 3调整部分
int main()
{
int i =0;
//初始化 判断 调整
for(i = 1; i<=10 ;i++)
{
printf("%d",i);
}
return 0;
}
break和continue在for循环中的功能与while循环一致
int main()
{
int i =0;
//初始化 判断 调整
for(i = 1; i<=10 ;i++)
{
if(i == 5)
continue;
printf("%d",i);
}
return 0;
}
for循环中continue不会跳过调整部分'i++'
1.不可在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法
1.for循环的初始化调整判断都可省略,但是for循环的判断部分如果被省略,那判断条件就是恒为真
int main()
{
for(;;)
{
printf("hehe\n");//死循环hehe因为for的判断部分被省略
}
return 0;
}
int main()
{
int i = 0;
int j = 0;
for(;i<10;i++)
{
for(;j<10;j++)
{
printf("hehe\n");
}
}
return 0;
}
结果为10个hehe,当j++至10时跳出第二个for循环后因j=0的初始条件消失,所以在跳出第二个for循环后,j恒等于10
int main()
{
int x,y;
for(x=0,y=0;x<2 && y<5;x++,y++)
{
printf("hehe\n");
}
return 0;
}
int main()
{
int i = 0;
int k = 0;
for(i=0,k=0;k=0;i++,k++)
k++;//该循环循环0次,因为该循环判断条件为k = 0,0为假,循环不进行
return 0;
}
do...while()循环
do
循环语句;
while(表达式);
int main()
{
int i =1;
do
{
if(i ==5)
continue;
printf("%d",i);
i++;
}
while(i<=10);
return 0;
}
break和continue在do while循环中功能与while/for循环相同
计算n的阶乘
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d",&n);
for(n,i=1;i<=n;i++)
{ret = ret*i;
}
printf("%d",ret);
return 0;
}
计算1!+...+n!的和
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for(n=1;n<=3;n++)
{
ret=1;
for(i=1;i<=n;i++)
{
ret = ret*i;
}
sum = sum + ret;
}
printf("sum = %d\n",sum);
return 0;
}
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for(n=1;n<=3;n++)
{
ret = ret*n;
sum = sum + ret;
}
printf("sum = %d\n",sum);
return 0;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int k = 9;
//写一个代码,在arr数组(有序的)中找到7
int sz = sizeof arr / sizeof arr[0];
int n = 0;
for(n=1;n<=sz;n++)
{
if(k == arr[n])
{printf("找到了,下标为:%d\n",n);
break;
}
if(n==sz)
printf("找不到\n");
}
return 0;
折半查找算法/二分查找算法 算法次数=log2n
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 9;
int sz = sizeof(arr)/sizeof(arr[0]);//计算数组元素个数
int left = 0;//左下标
int right = sz-1;//右下标
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]>k)
{
right = mid-1;
}
else if(arr[mid]<k)
{
left = mid+1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
if(left>right)
{
printf("找不到\n");
}
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
//welcome to bit!!!
//#################
//w################
//w###############!
//...
//welcome to bit!!!
//char arr[] = "abc";
//[a b c \0]
//0 1 2 3
//4-2
char arr1[] = "welcome to bit!!!!!";
char arr2[] = "###################";
int left = 0;
//int right = sizeof(arr1)/sizeof(arr1[0])-2;
int right = strlen(arr1)-1;
while(left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
//休息一秒
Sleep(1000);
system("cls");//执行系统命令的一个函数-cls -清空屏幕函数
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
int i = 0;
char password[20] = {0};
for(i=0;i<3;i++)
{
printf("请输入密码:>");
scanf("%s",password);
if(strcmp(password, "123456")==0)//== 不能用来比较两个字符串是否相等
//应该使用一个库函数-strcmp
{
printf("登录成功\n");
break;
}
else
printf("密码错误\n");
}
if(i == 3)
printf("三次密码均错误,退出程序\n");
return 0;
}
c语言学习笔记2021_08_06
最新推荐文章于 2024-07-24 17:46:08 发布