我使用C语言并不频繁,一般都是用来实现数据结构与算法,因为面向过程的编程方式容易理解算法的原理,但是呢,如果很长时间没写算法,那么就意味着C语言的某些语法就生疏了,但是总有那么一些,在写算法的时候,特别常用的,所以,我就专门写下来,不用再没头没脑的复习C语言了。

  在提醒一下,这里只说C语言,不涉及C++。

声明普通变量

#include<stdio.h>
int main()
{
int iVar = 10;
float fVar = 10.01;
double dVar = 10.001;
//bool flag = true;//C语言中没有bool类型
char cVar = 'a'; //字符类型使用单引号括起来 printf("%d\n", iVar);
printf("%f %f\n", fVar, dVar);
printf("%c\n", cVar);
printf("%s\n", NAME);
return 0;
}

声明指针

int *ptr = NULL; //这里请使用大写的NULL,小写的null不对
int a = 10;
ptr = &a;
printf("%p %d\n", ptr, *ptr); 

声明数组

//定义整型数组(浮点型是一样的)
int arrInt[10] = {1,2,3,4,5,6,7,8,9,10}; //也可不指定数组长度,长度会根据实际的元素个数来设置
int arrInt2[] = {9,8,7,6,5,4,3,2,1};
printf("%d\n", sizeof(arrInt) / 4); //10
printf("%d\n", sizeof(arrInt2) / 4); //9 int i = 0; //遍历数组——case1
for (i = 0; i < 10; i++) {
printf("%d ", arrInt[i]);
} //数组名还有另外一层含义:数组首地址(可以加*解引用来访问值)
int *ptr = arrInt;
printf("%d\n", *ptr); //输出了arrInt[0] --> 1
//遍历数组——case2
for (i = 0; i < 10; i++) {
printf("%d ", *(ptr++));
printf("%d ", *(arrInt + i));
//printf("%d ", *(arrInt++)); 不要尝试这么做
}

  

字符与字符串

//务必保证数组长度比字符数量多1,因为结束有一个\0
char arrCh1[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char arrCh2[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char arrCh3[] = "hello"; //自动添加\0,推荐使用这种方法,可以不用指定长度。
char *arrCh4 = "hello world"; //声明一个字符型指针,指向字符串的首地址,推荐使用。 //注意strlen只会返回字符数组中,实际的字符数量(并不是声明的长度)
//所以arrCh1的长度是5,并不会将\0算在长度中
printf("%d\n", strlen(arrCh1)); //5
printf("%d\n", strlen(arrCh2)); //5
printf("%d\n", strlen(arrCh3)); //5
printf("%d\n", strlen(arrCh4)); //11 //遍历字符数组(字符串)
int i = 0;
while (arrCh1[i] != '\0') {
printf("%c ", arrCh1[i++]);
} //直接输出字符串。因为数组名是字符串的首地址,那么就可以直接输出了
//注意不用加*
printf("%s\n", arrCh1);
printf("%s\n", arrCh2);
printf("%s\n", arrCh3);
printf("%s\n", arrCh4);

  

声明并创建结构体

#include<stdio.h>
#include<stdlib.h>
struct Person {
//int age = 10; 不能设置默认值
int age;
char *name;
}; //末尾加分号
int main()
{
//创建结构体变量的时候,前面不止要加结构体名,还要加struct关键字
struct Person p;
p.age = 10;
p.name = "abcdefg";
printf("%d %s\n", p.age, p.name); //结构体指针
struct Person *ptr;
ptr = (struct Person*)malloc(sizeof(struct Person));
ptr->age = 20;
ptr->name = "xyzdddddd";
printf("%d %s\n", ptr->age, ptr->name);
free(ptr);
return 0;
}

  

共用体

#include<stdio.h>
#include<string.h> //这个union只占用10个字节空间
union Info {
int age;
char name[10];
char addr[10];
};
int main()
{
//声明共用体实例同样要使用union关键字加上共用体名称
union Info t;
t.age = 10;
printf("%d\n", t.age); //给字符数组赋值可以使用strcpy(dest, source)
strcpy(t.name, "hello");
printf("%s\n", t.name); //此时age的数据已经被清除了。因为他们共用一段空间
printf("%d\n", t.age);
return 0;
}

  

typedef和define

#include<stdio.h>

//define用来定义常量,语句末尾不加分号
#define ONE "1111111"
//define是预编译器处理 //typdef用来声明别名,语句末尾要加分号
typedef int* ptr;
//typedef是编译器处理 int main()
{
int a = 10;
ptr b = &a; //使用新定义的类型
printf("%s\n", ONE); //输出常量
printf("%d\n", *b);
return 0;
}

  

隐式类型转换

  注意在类型转换的时候,精度丢失的问题。

#include<stdio.h>
int main()
{
double dd = 10.0001;
int ii = dd; //隐式转换。
printf("%d\n", ii); //10
printf("%f\n", dd); //10.0001
//printf("%d\n", dd); //错误用法。注意不会发生类型转换 int i = 10;
double d = i / 3.0; //隐式转换
printf("%f\n", d); //3.333333
return 0;
}

强制类型转换

  注意在类型转换的时候,精度丢失的问题。

#include<stdio.h>
#include<stdlib.h>
struct Person {
int age;
char *name;
};
int main()
{
double dd = 100.0001;
int a = dd; //隐式转换
double b = (double)a; //强制类型转换
printf("%d\n", a);
printf("%f\n", b); //强制类型转换
struct Person *p = (struct Person*)malloc(sizeof(struct Person));
return 0;
}

  

函数

  函数可以定义为无返回值(void),或者有返回值(int、char.....)

  无返回值的函数

#include<stdio.h>

//打印数组
void PrintArr(int *a, int length){
int i;
for (i = 0; i < length; i++){
printf("%d ",a[i]);
}
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1};
int length = sizeof(a) / 4;
PrintArr(a, length);
return 0;
}

  有返回值的函数

#include<stdio.h>

int is_odd(int a){
return a&1;
}
int main()
{
printf("%d\n", is_odd(2)); //0
printf("%d\n", is_odd(3)); //1
return 0;
}

  

实现数据结构与算法需要掌握的C语言的更多相关文章

  1. 数据结构与算法之顺序栈C语言实现

    顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...

  2. 数据结构与算法之顺序表C语言实现

    顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...

  3. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  4. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

  5. 用Python实现的数据结构与算法:开篇

    一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...

  6. 开启基本数据结构和算法之路--初识Graphviz

    在我的Linux刀耕开荒阶段,就想开始重拾C,利用C实现常用的基本数据结构和算法,而数据结构和算法的掌握的熟练程度正是程序的初学者与职业程序员的分水岭. 那么怎么开启这一段历程呢? 按照软件工程的思想 ...

  7. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  9. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

随机推荐

  1. Win10改AHCI无需重装系统(无需改注册表)的方法

    下面就开始:1.开机后按下WIN键 加 R键2.输入 msconfig3.如图中所示进行点击.1 引导界面 2安全引导打钩 .最小打钩 3 下面的确定.4.点击重新启动5.在重启时连续按 F2 进入B ...

  2. Xmanager power suit 6 最新版注册激活

    Xmanager Power Suit 6.0.0012 最新版注册激活,长期更新 操作步骤 Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能 ...

  3. 聚类——K-means

    聚类——认识K-means算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.聚类与分类 聚类: 无监督学习.聚类是在预先不知道欲划分类的情况下, ...

  4. 数据结构【查找】—B树

    /*********************讲解后期补充*****************/ 先上代码 #include "000库函数.h" #define MAXSIZE 10 ...

  5. MySQL高级知识(十五)——主从复制

    前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...

  6. 经常在比特币中看到的merkle树是什么?

    区块基础-merkle树   Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的, ...

  7. 假设在本地搭一个server和mysql数据库环境,假设使用java来訪问数据库

    我们能够使用speedamp来搭一个server环境,能够在http://download.csdn.net/detail/baidu_nod/7630265下载 解压后无需安装直接能够使用.点击Sp ...

  8. PHP json_encode 中文乱码

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   在编码过程中.经常会用到json_encode来处理中文.但是.出现一个问题.中文 ...

  9. day 03 基本数据类型的使用、运算符

    一:基本数据类型的使用 1.为什么数据要区分类型 数据类型指的是变量值的类型,变量值是用来记录事物的状态的,而事物的状态具有不同的类型,不同类型的变量值表示不同类型的状态,所以数据要区分类型. 2.数 ...

  10. 15.io流,递归

    一.file的常用api 二.算法:递归1.定义:递归算法是把问题转化为规模缩小了的同类问题的子问题.然后递归调用函数(或过程)来表示问题的解.一个过程(或函数)直接或间接调用自己本身,这种过程(或函 ...