一、c语言中的常量 C语言中的常量分为以下几种: ·字面常量:“3.14”;“10”;“a”;"abcdef" ·const修饰的常变量:如下代码,输出结果为10,因为其已被const修饰,变为常变量...\" 只是单纯的为了输出单引号和双引号 #include int main() { print("\'"); print("\""); return 0; } 3....include int main() { printf("a\ta"); return 0; } 输出结果为 4.转义字符\ddd和\xdd ddd表示1~3个八进制的数字...本题答案为:14 五、注释 注释有两种风格:·C语言风格的注释/*xxxxx*/ 缺陷:不能嵌套注释...1 #include int main() { int coding = 0; printf("你会努力学c语言吗?
5、指针运算 5.1指针 +- 整数 在 C语言(指针)1中,我们已经了解过了指针 +- 整数的情况,知道了指针 +- 整数的结果取决于它所指向的对象的类型,这里再来看一种指针...我们可以用上面学到的东西来模拟实现strlen函数,关于strlen函数在之前的文章 —> C语言基础 中已经介绍过,strlen函数的作用是计算字符串的长度,统计的是字符串中 “\0” 之前的字符个数...野指针在C语言中是非常可怕的,可能会导致内存泄漏、程序崩溃、安全漏洞、数据损坏等,我们一定要避免野指针的出现。...NULL是C语言中定义的一个标识符常量,值是0,0也是地址,但这个地址(空指针)是无法使用的,读写地址会报错,但不会构成野指针。...(3)指针变量不再使用时,及时置NULL,指针使用之前检查有效性; (4)避免返回局部变量的地址。
这一篇文章我们从常见关键字开始说起,也是我们初识C语言最后一篇文章了,后面会给大家从各个方面详细的展开来分析,下一篇文章我们会分析分支语句与循环语句。 ...register return short signed sizeof static struct switch typedef union unsigned void volatile while C语言提供了丰富的关键字...{ //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; } 10.2关键字static 在C语言中...13.结构体 结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。 这里只能使用结构体来描述了。...初识C语言到这里就结束啦!感谢烙铁们的阅读,后续会给大家带来更多有用的知识。
C语言的许多特性是为了方便编译器设计者而建立的。----唉,怎么这个样子 C语言的基本数据类型直接与底层硬件相对应。...这也是为什么C++语言令人失望的原因:它对C语言中存在的一些最基本问题没有什么改进,而它对C语言最重要的扩展(类)却是建立在脆弱的C类型模型上。...第3章-- 分析C语言的声明 声明器(declarator), 就是标识符以及与它组合与它组合在一起的任何指针,函数括号,数组下标等。...int几乎是C语言所有的默认方式。应该也是C最善于处理的数据类型。...int apricot[2][3][5]; // apricot 两个[3][5]的数组,2*3个[5]的数组,2*3*5个int int (*p)[3][5] = apricot; // 步长 3
==str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0...Add(int x, int y) { return x + y; } int (*p)(int, int) = Add; int main() { int a = 4, b = 8; int c...int Add(int x, int y) { return x + y; } int main() { int (*p)(int, int) = Add; int c =(*p)(2,5);...printf("%d ", c); return 0; } 像这样,可能看起来甚至没有直接写Add来的快?...(均出自于C陷阱和缺陷) (*(void (*)())0)(); 这里突破点是void (*)(),这是函数指针,然后0的前面有括号,括号?
相反,3和4他们指向同一个常量字符串,C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。所以3和4是一样的。 2....过去我们有一个二维数组的需要传参给一个函数的时候,我们是这样写的: #include void test(int a[3][5], int r, int c) { int i = 0...; int j = 0; for(i=0; i<r; i++) { for(j=0; j<c; j++) { printf("%d ", a[i][j]); } printf("\n"); } } int...main() { int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}}; test(arr, 3, 5); return 0; } 这里实参是二维数组...int ( * parr1[3])(); int * parr2 3 ; int ( * )() parr3[3]; 答案是parr1 parr1 先和 [ ] 结合,说明parr1是数组,数组的内容是什么呢
char ucPim1; unsigned char ucData0 : 1; unsigned char ucData1 : 2; unsigned char ucData2 : 3;...pstPimData = (struct tagPIM*)puc; memset(puc,0,4); pstPimData->ucPim1 = 2; pstPimData->ucData0 = 3;...ucData1 = 4; pstPimData->ucData2 = 5; printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]...return 0; } 正确答案:B 接下来画图分析一下题目: 由图分析可知,最后puc[0]里存放的是00000010,puc[1]里存放的是00101001,puc[2]里存放的是00000000,puc[3]
函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数。(一个project可以有多个.c文件,但只能有一个main函数。...常见错误就是把多个题目程序代码.c放到一个工程下面,每个里面都有main函数,编译不报错,组建会报错。) C语言源程序中的函数是指完成特定数据处理任务、功能上独立的一个程序段。.../函数体 ....... return 0; //返回值 } 函数体的主要成分:变量定义序列+语句序列(VC6.0里面定义序列不能在语句序列之后) int r=5; int f=3;...; 3. 控制语句 控制语句是由特定的语句定义符组成,使用控制语句可实现程序的各种结构方式,从而实现对程序流程的控制。 C语言的九种控制语句。...3)转向语句:break语句、goto语句(尽量少使用,不利于结构化程序设计)、continue语句、return语句。 4.
1、C陷阱与缺陷概述 C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。...1.1 =不是== C语言则是用=表示赋值而用==表示比较。这是因为赋值的频率要高于比较,因此为其分配更短的符号。...3 连接 一个C程序可能有很多部分组成,它们被分别编译,并由一个通常称为连接器、连接编辑器或加载器的程序绑定到一起。...因此从其它语言转到C语言的程序员应该特别小心地使用数组: int i, a[10]; for(i = 1; i <= 10; i++) a[i] = 0; 4.4 C并不总是转换实参 下面的程序段由于两个原因会失败...譬如在一些编译器中,它的输出为0 0 0 0 0 1 2 3 4。 为什么?因为c的声明是char而不是int。当你令scanf()去读取一个整数时,它需要一个指向一个整数的指针。
第一代程序员使用机器码 第二代程序员使用汇编 第三代程序员使用C语言 C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进 之前控制寄存器是配置GPFCON和GPFDAT寄存器...,通过地址访问,所以可以用C语言来进行对地址的访问。...GPFCON——0x5600,0050 GPFDAT——0x5600,0054 目录 S3C2440芯片手册导读 用指针表示 代码的编写 调错 S3C2440芯片手册导读 对于GPFCON,只用到了16...表示如下: *pGPFCON = 0x100; //0x400 //配置成输出引脚 *pGPFDAT = 0; //低电平点灯 会导致 在这两个地址中把这两个数据写进去 代码的编写 在编写C语言的代码前...start.S -o start.o arm-linux-gcc -c led.c -o led.o arm-linux-ld -Ttext 0 led.o start.o -o led.elf#链接
1.变量名(标识符) 变量名:变量名在 C 语言里面属于标识符(identifier),命名有严格的规范。 只能由字母(包括大写和小写)、数字和下划线(_)组成。 不能以数字开头。...2.声明变量 C语言的变量,必须先声明后使用。如果一个变量没有声明,就直接使用,会报错。 每个变量都有自己的类型(type)。声明变量时,必须把变量的类型告诉编译器。...3.变量赋值 C语言会在变量声明时,就为它分配内存空间,但是不会清除内存里面原来的值。这导致声明变量以后,变量会是一个随机的值。所以,变量一定要赋值以后才能使用。 赋值操作通过赋值运算符=完成。...虽然 C语言会自动转换类型,但是应该避免赋值运算符两侧的类型不一致。...C语言的变量作用域主要有两种:文件作用域(file scope)和块作用域(block scope)。
新手C语言学习(3) 今天在牛客网写简单题的时候,一道计算五个数的平均数的题吸引了我,我以为很简单,但我却出现了很多的错误。...解题 #include int main(void) { int a,b,c,d,e; float ret; printf("请输入五个分数:\n"); scanf("%...d,%d,%d,%d,%d",&a,&b,&c,&d,&e); ret = (a + b + c + d + e)/5.0; printf("%.1f",ret); return 0; } 其中
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...过去我们对于一个二维数组需要传参时,是这样写的: #include void test(int a[3][5], int r, int c) { int i = 0; int...j = 0; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { printf("%d ", a[i][j]); } printf...如下: #include void test(int(*p)[5], int r, int c) { int i = 0; int j = 0; for (i = 0; i...< r; i++) { for (j = 0; j < c; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); }
中的内容交换(数组一样大) #define _CRT_SECURT_NO_WARNINGS #include #include int main() { int a[3]...,b[3],c[3]; int i,j,k; printf("请输入第一个数组a[3]:"); for(i=0;i<3;i++) scanf("%d",%a[3]); for(j=0;j<3;j++...) scanf("%d",%b[3]); for(k=0;k<3;k++) {c[k]=a[k];} for(i=0;i<3;i++) {a[i]=b[i];} for(j=0;j<3;...j++) {b[k]=c[k];} for(i=0;i<3;i++) {printf("交换后的数组a[]为%d",a[i]);} for(j=0;j<3;j++) {printf("交换后的数组...b[]为%d",b[i]);} } system("pause"); return o; } 2.计算1/1-1/2+1/3-1/4…+1/99-1/100的值 #include #include
(3) A.n(n+2)/2 B....(n-1)(n+2) 解析:先看代码构成,两个循环嵌套在了一起,每一次循环都会执行一次语句3,那么我们的目标就是计算出总循环的次数。...再看C选项,C说判断等于的符号不对,观察发现问题代码,if (x % min = 0 && y % min = 0)我们判断相等时要用两个=号,一个=号是赋值的意思,故要选C。...最后看D选项,if(a==0) printf("%d\n",x); else printf("%d\n",y);当a等于0时打印x,不等于0时打印y,和之前的都不一样,故答案为D 5、我们知道C语言的...= 1 && condition3; ) { if (condition1) symbol = 1; } } C解析:当condition满足时,symbol被赋值为1。
int main() { printf("指针接收字符\n"); char ch = 'w'; char* pc = &ch; printf("\t*pc=%c\n", *pc); printf...printf("指针接收字符串\n"); const char* pstr = "abcdef";//const 加了一层保护,使其变成常量字符串,被修改编译器会报错 printf("\t*pstr=%c\...=%c\n", pstr[3]);//[]是特殊的解引用操作符,等价于*(pstr+3),相当于得到第1个元素偏移3得到第四个元素 printf("\tabcdef[3] = % c\n", "abcdef...其实数组指针有自己的应用场景,在此之前要先了解二维数组传参的本质 以往我们对有一个二维数组需要传递给函数时,我们是这样写的 void test(int a[][5], int r, int c) {...0; j < c; j++) { printf("%d ",p[i][j]); } printf("\n"); } } int main() { int arr[3][5] = {
#include int main() { char cArr[] = {'I', 'L', 'O', 'V', 'E', 'C'}; char sArr[] = "ilovec
1.字符指针变量 //int main() //{ // char ch = 'w'; // char*pc=&ch; // printf("%c", *pc); // return...0; //} /*int main() { //char* p = "abcdef"; //char arr[] = "abcdef";//常量字符串 a b c d e f \0...//char* pc = arr;//将数组首元素的地址存在p中 const char* p = "abcdef";//这里的赋值是讲字符串中首字符的地址存在p中 printf("%c\...在C语言中,二维数组可以看作是由多个一维数组组成的连续存储空间。...在C语言中,二维数组可以看作是由多个一维数组组成的连续存储空间。
str3和str4的空间是一样的走if,因为str3和str4的内容是一样的编译器会把str4的空间指向str3的空间,所以空间是一样的 数组指针 数组指针是一个指向数组的指针 数组指针初始化就是取地址给数组指针就可以了...day() { printf("***************************\n"); printf("*** 1.加法 2.减法 ****\n"); printf("*** 3....int add1(int x, int y) { return x - y; } //乘法 int add2(int x, int y) { return x * y; } //除法 int add3(...4 int (*arr[5])(int, int) = { 0,add,add1,add2,add3 }; //用来访问函数指针数组的下标 scanf("%d", &f); printf...4 int (*arr[5])(int, int) = { 0,add,add1,add2,add3 }; //用来访问函数指针数组的下标 scanf("%d", &f); printf
; return 0; } 结构体成员变量分配内存的详细过程: 1.首先:char c为第一个成员变量,遵循第一条规则,char c从偏移量0开始,占1个字节...2.强化训练 struct S3 { double d; char c; int i; }; struct S4 { char c1; struct S3 s3; double d;...sizeof(s4) 练习4.结构体内存分配过程: 1.首先:char c1为第一个成员变量,遵循第一条规则,char c从偏移量0开始,占1个字节,指针指向下一个偏移地址1 2....其次,第二个成员变量为结构体S3,说明是嵌套结构体,通过刚才对S3的结构体大小可知是16字节,且S3中最大对齐数为8,通过规则4可知,现指针指向的偏移地址1并不是对齐数8的整数倍,所以指针需要向后跳转...第一个因为内存对齐,虽然ch只有1字节,但浪费3个字节 可以保证只读取到ch (不读到i) 第二个因为内存不对齐,会访问到ch和i的前3个字节的内容。会出问题
领取专属 10元无门槛券
手把手带您无忧上云