文档章节

实现数据结构与算法需要掌握的C语言

o
 osc_x4h57ch8
发布于 2018/04/24 09:42
字数 1203
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

  我使用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;
}

  

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

图解ARP协议(二)ARP***原理与实践

一、ARP***概述 在上篇文章里,我给大家普及了ARP协议的基本原理,包括ARP请求应答、数据包结构以及协议分层标准,今天我们继续讨论大家最感兴趣的话题:ARP***原理是什么?通过ARP***可以做...

osc_91g5cdgs
12分钟前
0
0
shell进度条实现

#!/bin/bashb=''i=0while [ $i -le  100 ]do    printf "progress:[%-50s]%d%%\r" $b $i    sleep 0.1    i=`expr 2 + $i`            b=#$b......

osc_npw5uz1o
14分钟前
13
0
通过ssh实现登录服务器脚本

版本v1 #!/bin/bash########################author: Bovin########################show all host infos of serverList.txtif [[ -f $HOME/.serverList.txt ]]then  hos......

osc_lt2jwwhb
15分钟前
0
0
VMware Fusion下Centos联网

1.VMware Fusion设置选择“网络适配器” 2.“连接我的网络适配器”选择“与我的mac共享” 3.编辑centos的ip配置文件 [root@Centos ~]# more /etc/sysconfig/network-scripts/ifcfg-eth0D...

osc_pg5rp78i
16分钟前
0
0
Kickstart配置文件参数详解

kickstart是什么? KickStart是一种无人值守的安装方法。它的工作原理时在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成K...

osc_r9yyhhqz
17分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部