本篇博客(笔记)主要是根据本身对编程语言和C编程语言的理解,总结复习所创做的,包括简单的概述和主要的实现代码。
不一样于另一篇博客《关于编程.md》中介绍的内容 ,本篇博客主要是代码干货。html
数据表达主要包括:量的概念,数据类型,数据运算,表达式 ,返回值,共5部份内容(目前暂且总结如此)。编程
常量是直接指定的字面量。
示例代码段:数组
/* *本段程序代理主要在于:量-常量的学习和使用 */ #include<stdio.h> int main(){ printf("I am number:100\n"); //经过printf函数,打印字符串常量,整型常量,转义字符(字符常量) return 0; }
变量是某块约定大小(约定大小能够理解为数据类型)的内存区域的标签。
变量=内存区域,变量值=内存存放值,变量地址=内存地址,变量声明=编译器开辟内存
取值操做=取内存地址,解引地址=取内存值
示例代码段:数据结构
/* *本段程序代理主要在于:量-变量的学习和使用 */ #include<stdio.h> int main(){ //整型变量 int int_var_001 = 100; printf("int_var_001 is :%d\n",int_var_001); //字符变量 char char_var_001 = 'A'; printf("char_var_001 is :%c\n",char_var_001); //字符串变量 char * string_var_001 = "liwanliang"; printf("string_var_001:%s\n",string_var_001); return 0; }
编程语言的数据类型均可以分为两大类:基本数据类型,扩展数据类型(或者构造数据类型)
同时任何数据都只有两种表现方式:数,字符,这是数据的基本组成元素。基本元素组成基本数据类型。
C语言基本数据类型包括:整型,字符,字符串,枚举,空类型编程语言
/* * 本程序段主要打印内置的数据类型,取值范围,最值等 */ #include<stdio.h> #include<limits.h> #include<float.h> int main(){ printf("----------size------------\n"); printf("1 byte,sizeof(char):%d\n",sizeof(char)); printf("2 byte,sizeofof(short int):%d\n",sizeof(short)); printf("4 byte,sizeofof(int):%d\n",sizeof(int)); printf("4 byte,sizeofof(float):%d\n",sizeof(float)); printf("8 byte,sizeofof(long int):%d\n",sizeof(long)); printf("8 byte,sizeofof(double):%d\n",sizeof(double)); printf("--------max and min------\n"); printf("char max:%d,char min:%d\n",CHAR_MAX,CHAR_MIN); printf("unsign char max:%d,char min:%d\n",UCHAR_MAX,0); printf("short max:%d,short min:%d\n",SHRT_MAX,SHRT_MIN); printf("unsign short max:%d,short min:%d\n",USHRT_MAX,0); printf("int max:%d,int min:%d\n",INT_MAX,INT_MIN); printf("unsign int max:%ld,int min:%ld\n",UINT_MAX,0); printf("long max:%ld,long min:%ld\n",LONG_MAX,LONG_MIN); printf("unsign long max:%lld,long min:%ld\n",ULONG_MAX,0); printf("FLT_MAX:%f,FLT_MIN:%f\n",FLT_MAX,FLT_MIN); printf("DBL_MAX:%f\n,DBL_MIN:%f\n",DBL_MAX,DBL_MIN); return 0; }
/* * 扩展数据类型:数组 * 整型数组的定义,初始化,值运算 * 字符数组和字符串 */ #include<stdio.h> #define SIZE 4 int main(){ //未初始化整型数组 int int_array_001[SIZE]; //初始化整型数组 int int_array_002[SIZE] = {1,2,3,4}; //循环进行数组初始化 for ( int i = 0; i < SIZE; i++ ) { int_array_001[i] = i; printf("int_array_001[%d] is : %d\n",i,i); } //循环输出数组值 for ( int i = 0; i < SIZE; i++ ) { printf("int_array_002[%d] + 100 = %d\n",i,i+100); } //字符数组 char char_array_001[SIZE] = {'l','i','w','l'}; for ( int i = 0; i < SIZE; i++ ) { printf("%c",char_array_001[i]); } printf("\n"); //字符数组初始化 char char_array_002[SIZE]; for ( int i = 0; i < SIZE; i++ ) { char_array_002[i] = 'A'; printf("char_array_002[%d]:%c\n",i,char_array_002[i]); } //字符串 char *name = "liwanliang"; //printf("%s\n",name); char char_array_003[sizeof("liwanliang")]; //printf("%d\n",sizeof("liwanliang")); for ( int i = 0; i < sizeof("liwanliang"); i++ ) { printf("%c ",*name++); } printf("\n"); return 0; }
扩展数据类型-数组函数
/* * 本代码段主要学习二位数组 * 主要是整型,字符,字符串型二维数组 */ #include<stdio.h> #define SIZE_C 2 #define SIZE_K 2 int main(){ //int型二维数组,未赋初值 int int_array_001[SIZE_C][SIZE_K]; int i,j; for ( j = 0; j < SIZE_K; j++ ) { for ( i = 0; i < SIZE_C; i++ ) { int_array_001[i][j]=i+j; printf("int_array_001[%d][%d]:%d\n",j,i,int_array_001[i][j]); } } //int型二位数组 printf("\n"); int int_array_002[SIZE_C][SIZE_K] = {{1,2},{3,4}}; int m,n; for ( n = 0; n < SIZE_K; n++ ) { for ( m = 0; m < SIZE_C; m++ ) { printf("int_array_002[%d][%d]:%d\n",n,m,int_array_002[n][m]); } } //char型二维数组,未赋初值 printf("\n"); char char_array_001[SIZE_C][SIZE_K]; int k,t; for ( t = 0; t < SIZE_K; t++ ) { for ( k = 0; k < SIZE_C; k++ ) { char_array_001[k][t] = 'A'+k+t; printf("char_array_001[%d][%d]:%c\n",t,k,char_array_001[k][t]); } } return 0; }
扩展数据类型-结构体学习
/* * 本段代码主要用于学习结构体的实践 * 结构体是基于基本数据结构扩展的数据类型 * 由于数组也是数据类型,相互结合就会存在结构体数组和数组结构体的概念 * 结构体实际上至关于本身定义了一个静态类型数据类型 */ #include<stdio.h> int main(){ /* * 结构体内部只用于定义数据类型,不能初始化 * 定义数据类型知识告诉编译器其存储结构 */ struct struct_001{ //ID unsigned int id; //字符串型 char *name; //int型 int age; //字符型 char sex; }; struct struct_001 str_liwl_001 = { 9, "liwanliang", 28, 'M' }; //重命名struct_001数据类型 //typedef struct struct_001 str_001; //声明变量 //str_001 str_liwl_001; //str_001 str_liwl_001 = { 0,"liwanliang01",28,'M'}; printf("str_liwl_001.id:%d\n",str_liwl_001.id); printf("str_liwl_001.name:%s\n",str_liwl_001.name); printf("str_liwl_001.age:%d\n",str_liwl_001.age); printf("str_liwl_001.sex:%c\n",str_liwl_001.sex); printf("\n"); //结构体数组.其初始化能够在声明时进行,也能够单独进行(for循环)。 struct struct_001 struct_array_001[3] = {{0,"liwanliang01",21,'M'},{1,"liwanliang02",22,'F'},{2,"liwanliang03",23,'N'},}; int i = 0; for ( i = 0; i < 3; i++ ) printf("%d,%s,%d,%c\n",struct_array_001[i].id,struct_array_001[i].name,struct_array_001[i].age,struct_array_001[i].sex); //结构体元素包括数组,结构体 struct struct_002 { int int_array_001[3]; struct struct_001 struct_liwl_01; struct struct_001 struct_liwl_02[3]; }; struct struct_002 struct_liwl_002 = { {1,2,3},{0,"liwanliang1",21,'M'}, }; printf("%d\n",struct_liwl_002.int_array_001[2]); printf("%d,%s,%c\n",struct_liwl_002.struct_liwl_01.id,struct_liwl_002.struct_liwl_01.name,struct_liwl_002.struct_liwl_01.sex); return 0; }
/* * 本程序片断主要学习控制结构-条件控制 * 条件控制 * 是对if语句后的(条件)表达式的返回值进行真值判断,根据不一样的真值结果执行不一样的语句模块 * if 语句的三种模型: * 1.若是,那么 * 2.如何就,不然就 * 3.嵌套 */ #include<stdio.h> int main(){ //if 基本原理:表达式结果为真时执行.大可能是条件表达式,不多是量(常量或者变量),或者运算表达式 if ( ! 0 ) //表达式结果非零,执行语句 printf("This line cat be print,because of !0\n"); if ( 0 ) //表达式结果零,不执行 printf("This line can't be print\n"); if ( 1 ) printf("1\n"); //非零值执行 //若是,那么 | 单条件,单分支 int int_var_001 = 100; //if ( 1 ) if ( int_var_001 > 1 ) printf("int_var_001:%d > 1\n",int_var_001); printf("\n"); //若是就,不然就 | 单条件,双分支 if ( int_var_001 > 101 ) printf("int_var_001:%d > 101\n",int_var_001); else printf("int_var_001:%d < 101\n",int_var_001); printf("\n"); //若是,就;不然若是,就;不然若是,就;不然,就 | 单条件,多分支 if ( int_var_001 > 50 ) printf("int_var_001:%d >= 100\n",int_var_001); else if ( 50 < int_var_001 < 100 ) printf("50 < int_var_001:%d < 100\n",int_var_001); else if ( int_var_001 >= 100 ) printf("int_var_001:%d >= 100\n",int_var_001); else printf("int_var_001:%d < 50\n",int_var_001); //若是:若是,就:就 | 嵌套 if ( int_var_001 > 50 ) { printf("int_var_001:%d > 50\n",int_var_001); if ( int_var_001 > 80 ) //{ printf("int_var_001:%d > 80\n",int_var_001); //} } else //{ printf("int_var_001:%d < 50\n",int_var_001); //} printf("\n"); /*多个条件的状况*/ int int_var_002 = 200; int int_var_003 = 300; //若是,那么 | 多个条件,单分支 if ( int_var_003 > int_var_002 && int_var_001 > 50 ) { printf("int_var_003:%d > int_var_002:%d\n",int_var_003,int_var_002); printf("int_var_003:%d - int_var_002:%d = %d\n",int_var_003,int_var_002,int_var_003 - int_var_002); } //若是就,不然就 | 多个条件,双分支 if ( int_var_003 < int_var_002 || int_var_001 != 100 ) printf("int_var_003:%d < intt_var_002:%d 或者 int_var_001 = %d\n",int_var_003,int_var_002,int_var_001); else printf("判断失败\n"); //嵌套 | 多个条件,多分支 if ( int_var_003 < int_var_002 && int_var_001 == 100 ) printf("首个条件判断成立\n"); else if ( int_var_003 == 300 && int_var_002 == 200 && int_var_001 == 100 ) printf("第二个条件判断成立\n"); else printf("判断失败\n"); // 三元表达式:等价于双分支 printf("%d\n",int_var_003 > int_var_002 ? int_var_003 : int_var_002); // swtich语句: 等价于多分支 switch (int_var_003 - int_var_002) { //switch后跟表达式:赋值表达式,运算表达式,条件表达式,逻辑表达式等 case 1: //case是表达式的返回值 printf("1\n"); break; case 10: printf("10\n"); break; case 100: printf("100\n"); break; default: //无匹配值时的默认值 printf("no\n"); } // 条件跳转和返回 int int_var_004 = 0; int int_var_005 = 5; for ( int_var_004 = 0; int_var_004 < 10; int_var_004++ ) { if ( int_var_004 == int_var_005 ) return; //结束函数,退出(本段代码会直接跳出主函数,不执行Last line //break; //跳出循环,执行Last line //continue; //跳过本次循环,执行Last line printf("run at:%d\n",int_var_004); } printf("Last line\n"); return 0; }
#include<stdio.h> int main(){ /*for*/ //根据条件遍历一次 int int_var_001 = 0; for ( int_var_001 = 0; int_var_001 < 10; int_var_001++ ) { //printf("int_var_001:%d\n",int_var_001); printf("int_var_001:%d,是%c\n",int_var_001,int_var_001%2?'A':'B'); } printf("\n"); /*while*/ //先遍历条件判断,后操做 int int_var_002 = 10 ; while ( int_var_002 != 0 ) { printf("int_var_002:%d\n",int_var_002); int_var_002--; } printf("\n"); /*do-while*/ //先操做,后遍历条件判断 int int_var_003 = 10; do { printf("int_var_003:%d\n",int_var_003); int_var_003--; } while ( int_var_003 != 0 ); return 0; }
/* * 本代码段主要学习指针内容 */ #include<stdio.h> int main(){ /* *数据类型指针 */ //量 ////常量指针 ////变量指针 //////整型变量指针 int int_a = 100; int *p_int_a = &int_a; //*表示指针的声明 printf("%d\n",*p_int_a); //*表示解引指针=获取内存值 //////字符变量指针 char char_a = 'A'; char *p_char_a = &char_a; printf("%c\n",*p_char_a); //////字符串变量指针 char *string_a = "liwanliang"; char **p_string_a = &string_a; printf("%s\n",*p_string_a); printf("\n"); ////数组指针 //////整型数组指针 int array_001[4] = {1,2,3,4}; int *p_array_001 = array_001; //数组名就是数组首地址,也是第一个元素的地址 /*上行代码等效 int *p_array_001 = &array_001[0] */ printf("array_001[2]:%d\n",*(p_array_001+2)); int i001 = 0; for ( i001 = 0; i001 < 4; i001++ ) //for循环体中只有一行语句时,括号可省略 //{ printf("array_001[%d]:%d\n",i001,*p_array_001++); //*p_array_001++,指针运算,取值后指针+1xsize // printf("array_001[%d]:%d\n",i001,array_001[i001]); //等效于上一行 //} printf("\n"); //////字符数组指针,同上 //////字符串数组指针 char *array_002[3] = {"lwl","liwl","liwanliang"}; char **p_array_002 = array_002; int i002 = 0; for ( i002 = 0; i002 < 3; i002++ ) //{ printf("%s\n",*p_array_002++); // printf("%s\n",array_002[i002]); //等效于上一行 //}; ////二维数组指针 //在二维数组中,一维数组能够当作是基本数据类型,关系同字符和字符串 /*二维数组须要定义一个指向扩展类型的指针,而不是指向基本数据类型的指针*/ //////整型二维数组 int array_005 [4][4] = {{1,2,3,4},{5,6,7,8},{11,12,13,14},{15,16,17,18}}; printf("%d,%d,%d,%d\n",array_005,&array_005[0],&array_005[0][0],*array_005); //二维数组首地址的四种表示方式 int (*p_array_005)[4] = array_005; //定义一个数组指针(基本数据类型指针,扩展数据类型指针),这里是扩展数据类型指针-数组指针 printf("%d\n",*(*(p_array_005+3)+1)); int i004,i005 = 0; for ( i004 = 0; i004 < 4; i004++ ) { for ( i005 = 0; i005 < 4; i005++ ) printf("%d ",*(*(p_array_005+i004)+i005)); } printf("---------\n"); //////字符串二维数组 ////结构体指针 struct struct_var_001{ int id; char sex; char *name; }; //定义普通结构体 struct struct_var_001 str_liwl_001 = {1,'M',"liwanliang"}; //声明结构体变量 struct struct_var_001 *p_str_liwl_001 = &str_liwl_001; printf("%d,%c,%s\n",p_str_liwl_001->id,p_str_liwl_001->sex,p_str_liwl_001->name); //不须要解引符号的取值操做 printf("\n"); struct struct_var_002{ int array_int_002[4]; char array_char_002[4]; }; //带数组元素的结构体 struct struct_var_002 str_liwl_002 = {{1,2,3,4},{'A','B','C','D'}}; struct struct_var_002 *p_str_liwl_002 = &str_liwl_002; printf("%d,%c\n",p_str_liwl_002->array_int_002[3],p_str_liwl_002->array_char_002[3]); //数组仍是以普通方式索引 printf("\n"); struct struct_var_003{ int array_int_003[4]; int *p_array_int; char array_char_003[4]; char *p_array_char; }; //带指针元素的结构体 struct struct_var_003 str_liwl_003 = {{1,2,3,4},NULL,{'A','B','C','D'},NULL}; struct struct_var_003 *p_str_liwl_003 = &str_liwl_003; p_str_liwl_003->p_array_int = (int *)&(p_str_liwl_003->array_int_003); //将结构体的第一个元素地址赋值给第二个元素,须要强制类型转换 p_str_liwl_003->p_array_char = (char *)&(p_str_liwl_003->array_char_003); int i003 = 0; for ( i003 = 0; i003 < 4; i003++ ) printf("%d,%c\n",p_str_liwl_003->p_array_int[i003],p_str_liwl_003->p_array_char[i003]); printf("\n"); for ( i003 = 0; i003 < 4; i003++ ) printf("%d,%c\n",*(p_str_liwl_003->p_array_int)+i003,*(p_str_liwl_003->p_array_char)+i003); ////函数指针 ////指针的指针 return 0; }
参考教程:
http://c.biancheng.net/cpp/html/2930.html
https://blog.csdn.net/jhcconan614/article/category/6486327ui