C语言基础

Kinjaz1 2019-10-11 11:46:26

因为要看的实在太多,有点赶有点糙。。。。。
1.数据类型 话不多说直接上图
注意其中每个基本数据类型代表的英文单词;
对于其中的字符型(也就是char型),我们的编译系统有一个ASC||码与之一一对应,以数码的形式存储该字符,如小写英文字母a在ASC||码中就代表十进制为96的数,当然计算机只能识别二进制,会进行进一步翻译。
2.[u]printf()及scanf()函数[/u]
例:#include<stdio.h>
void main()
{
int a;
scanf("%d",&a);
printf("%d\n",a);
}
scanf()代表输入,将输入到屏幕上的数(或字符)赋值到&a上,&代表地址,不能省略。
printf()代表输出,将右边的a赋值到左边的%d上并输出到屏幕上。'\n'代表换行符。
两个函数都要注意(““)不能省
3.[u]对于c语言中一些重要结构一定要记牢[/u];
if-else语句:
if(i>0)
{
......;
}
else(i<=0)
{
.......;
}
还有更多选择的if语句如
if(i>=90)
{
......;
{
else if(i>=70)
{
.......;
}
else if(i>=60)
{
......;
}
.....
else()
{
....;
}
第二种叫分支选择语句,这里还有另一种分支选择语句:switch
switch(表达式)
{
case 判断值1: 语句组1;
break;
case判断值2: 语句组2;
break;
.........
default: 语句组;
break;
}
这里的表达式可以是单个变量,也可以是组合表达式,但其结果必须是一整值,同意判断值也必须是一个常量,case选择入口,break用于退出switch语句,若没有break,程序会依次往下执行。而说起break,还有一个语句作用与之相似,那就是continue语句,但它们的区别是break用于退出整个循环(只能跳出当前循环,若还有外循环则还在外循环之内),而continue则是结束当前这一次循环操作,及不在执行后面的语句而直接进入下一次循环判定
还有while和do-while语句
while(表达式判断)
{
循环体语句;
}
例设计一个计算1加到100的程序
#include<stdio.h>
void main()
{
int i;
int sum;
sum=0;
i=1;
while(i<=100)
{
sum+=i;
++i;
}
printf("sum=%d\n",sum);
}
do-while语句就是颠倒了一下顺序,即:
do
{
循环体;
}
whhile(表达式);

还有一种更强的循环结构:for循环

for(i=0;i<=100;i++)
{
sum+=i;
}
这也能计算1到100的和,比while语句逻辑更强更简洁。for后面的括号中一定有三个表达式。
4.对变量作用域的理解
变量可以分为全局变量和局部变量,在函数外定义的叫做全局变量,函数内定义叫局部变量。每一个变量都有自己的作用域,依据{}来划分,{}内的只能在之中起作用,{}的可以对整个起作用,有一些名称相同但确实是两个变量,当两者冲突时采取就近原则取值。

int x=0;
void main()
{
int x=10;
.....
)
在函数外x=0,而在函数内x=10.
struct结构体:到目前为止,我们可以很方便的定义单种想要的数据类型(如int型等等),但是如果碰到这样的情况:实现一个手机通讯录,需要以人为单位,且每个人的内部信息由姓名、年龄、手机号、住址之类的不同类型数据组成。这个时候如果使用但类型的变量进行罗列,那么操作起来就不太方便,而这些功能使用结构体(struct)却可以很好的实现。结构体在很多场合中非常常用,可以将若干个不同的数据类型的变量或数组封装在一起,以储存自定义的数据结构,方便储存一些复合数据。

1.结构体的定义

定义一个结构体的基本格式:

struct Name{ //一些基本的数据结构或者自定义的数据类型 };

当需要将一些相关的变量放在一起储存是,只要依次写出他们的数据类型和变量名称。例如,需要储存一个学生的学号、性别、姓名和专业,就可以这样定义:

struct studentInfo{ int id; char gender; //'F' or 'M' char name[20]; char major[20]; }Alice, Bob, stu[1000];

其中

(1)studentInfo是这个结构体的类型名;

(2)内部分布定义了id(学号)、gender(性别)、name(姓名)和major(专业),这些就是单个学生的信息;

(3)而在大括号外部定义了studentInfo型的Alice和Bob代表两个结构体变量;之后的stu[1000]就是当有很多学生定义的一个结构体数组可以放置1000个学生信息的数组(如果不在此处定义变量或者数组,则大括号外直接更上分号)。

结构体变量和结构体数组除了可以像上面一样直接定义外,也可以按照基本数据类型(如int型),那样定义:

studentInfo Alice; studentInfo stu[1000];

需要注意的是,结构体里面能够定义除了自己本身(因为这样会出现循环定义的问题)之外的任何数据类型。不过虽然不能够定义自己的本身,但是可以定义自身类型的指针变量。例如:

struct node{ node n; //错误不能定义自身 node类型变量 node* next; //正确可以定义node*型指针变量 };


2.访问结构体内的元素

访问结构体内的元素有两种方法:"."操作和"->"操作。现在吧studentInfo类型定义为如下:

struct studentInfo{ int id; char name[20]; studentInfo* next; }stu, *p;

这里studentInfo中多了一个指针next用来指向下一个学生的地址,且结构体变量中定义了普通变量stu和指针变量p。

于是访问stu中的变量的写法如下:

stu.id stu.name stu.next

而访问指针变量p中元素的写法如下:

(*p).id (*p).name (*p).next

可以看到,对结构体变量和结构体指针变量内元素的访问方式其实是一样的,在变量名后面加上"."然后跟上要访问的元素即可。但同时也会发现,对结构体指针变量中元素的访问写法略微复杂,所以C语言中又有一种访问结构体指针变量内元素的更加简洁的写法:

p->id p->name p->next

正如上面的写法,结构体指针变量内元素的访问只需要使用"->"跟上要访问的元素即可,且使用"*"或"->"访问结构体指针变量内元素的写法是完全等价的。
typedef:等我再看看吧。。。。
5函数:C语言本就是一块块函数拼接而成的,只能有一个主函数,可以有无数分函数,每一个函数分为两部分:函数定义和函数体,函数定义
包括存储类型,数据类型,函数名和形式参数说明。函数体分为说明语句和执行语句两部分。
函数之间能进行数据传递,有以下两种方法:值传递和地址传递。具体区别和各自特点就不在这详解了,只强调几点,值传递只能用return()传递一个值,地址传递是用指针,可传递多个值。值传递形参不影响实参,地址传递会影响。
递归函数就是自调用函数。
6.数组
一维数组定义方式:【存储类型】数据类型 数组名【常量表达式
如 int a[10]表示数组名为a,有10个元素。这10个元素分别是a[0] a[1] ........a[9],注意不能使用数组元素a[10]
可以对数组进行初始化,即对元素变量赋初值。如int data[5]={2,4,6,8,10}; 这时也可以不指定数组长度
int b[20]={1,2,3,4,5};表示只初始化前5元素,多余元素都是0.
[]中只能是常量和符号常量,不能是变量。
二维数组定义:【存储类型】 数据类型 数组名【下标】【下标】;
如 float a[3][3];
初始化: int a[3][3]={1,2,3,4,5,6,7,8,9,};
存放顺序:a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2]
对上述排列分别赋值1 2 3 4 5 6 7 8 9
推广 inta[3][4]={{1,2,3,4},{5.6,7,8},{9,10,11,12}}
也可只对部分赋初值
如 int a[3][3]=={{1,2},{1,2,3},{1}} 其余元素自动为0
二维数组一般用来解决矩阵相关问题
7.[b]指针[/b]
可以认为指针与地址是同义词,指针变量指向的内存区域中的数据称为指针的目标。
指针变量的定义与初始化
<存储类型> <数据类型> *指针名;
如 int *px;
char*name;
static int *pa;
指针变量与普通变量差不多,也分为内部的和外部的,全局的和局部的。其中的数据类型是指向目标的数据类型
初始化时赋予它的初值必须是地址量
如 int *pa=&a;
也可以把一个已经初始化的指针赋给一个指针变量,如
int n;
int *p=&n;
int Q=p
&表示取地址运算符 结果类型为操作类型的指针
*表示去内容运算符 结果类型为指针所指对象的类型
如 char c,*pc=&c;
*(&c)='a';
*pc='a';
c='a';
及*和&互为逆运算
下面设计一个程序,输入两个整数,按大小先后顺序输出,采用指针运算符来实现
#include<stdio.h>
int main()
{
int a,b;
int *pmax=NULL; //指针初始化为空指针”NULL"
int *pmin=NULL;
scanf("%d %d",&a,&b);
pmax=(a>b)?&:&b;
pmin=(a<b)?&a:&b;
printf("max=%d,min=%d\n",*pmax,*pmin);
rreturn 0;
}
运行结果: 5 9
max=9,min=5
后面关于指针运算和各种操作让我再看看吧。。。。。。
...全文
253 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

200

社区成员

发帖
与我相关
我的任务
社区描述
讨论 Informatica 数据隐私保护相关技术
数据分析数据挖掘 技术论坛(原bbs)
社区管理员
  • 数据隐私保护社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧