一、c语言中的常量 C语言中的常量分为以下几种: ·字面常量:“3.14”;“10”;“a”;"abcdef" ·const修饰的常变量:如下代码,输出结果为10,因为其已被const修饰,变为常变量 \" 只是单纯的为了输出单引号和双引号 #include<stdio.h> int main() { print("\'"); print("\""); return 0; } 3. include<stdio.h> int main() { printf("a\ta"); return 0; } 输出结果为 4.转义字符\ddd和\xdd ddd表示1~3个八进制的数字 本题答案为:14 五、注释 注释有两种风格:·C语言风格的注释/*xxxxx*/ 缺陷:不能嵌套注释 1 #include<stdio.h> int main() { int coding = 0; printf("你会努力学c语言吗?
字符指针变量 在指针的类型中,有一种指针类型为字符指针 char* 一般使用方法是: int main() { char ch='g'; char* p=&ch; printf("%c",*p); 0; } 运行结果: 因为str3和str4指向的是同一个常量字符串,C/C++会把常量字符串存储到单独的一个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存,但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块 过去我们有⼀个⼆维数组的需要传参给⼀个函数的时候,我们是这样写的: #include <stdio.h> void test(int a[3][5], int r, int c) { int i = ); } } 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 test(int arr[3][5], int r, int c) { int i = 0; int j = 0; for (i = 0; i < r; i++) { for (j = 0;
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语言到这里就结束啦!感谢烙铁们的阅读,后续会给大家带来更多有用的知识。
相反,3和4他们指向同一个常量字符串,C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。所以3和4是一样的。 2. 过去我们有一个二维数组的需要传参给一个函数的时候,我们是这样写的: #include <stdio.h> 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]
==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的前面有括号,括号?
5. switch语句 除了 if 语句,C语言还提供了 switch 语句来实现分支结构。 switch语句是一种特殊形式的 if...else... default: 语句3; } switch语句会根据 表达式 的不同值执行相应的case分支;如果都没有对应的情况,就执行 default分支。 注意: switch 后的 表达式 必须是整型表达式 case 后的值必须是整形常量表达式 5.1 if语句和switch语句的对比 练习:输入任意⼀个整数值,计算除3之后的余数 // 使用 if语句 #include <stdio.h> int main() { int n = 0; scanf("%d", &n); if(n % 3 == 0) printf } // 使用switch语句 #include <stdio.h> int main() { int n = 0; scanf("%d", &n); switch(n % 3)
int a,int b) { return a+b; } int main() { int a=10; int b=20; int (*p)(int,int)=&add; int c= (*p)(10,20);//*可加可不加 printf("%d",c); return 0; } 通过函数指针变量p调用add函数。 3,函数指针数组 存放函数指针的数组。 int (*pf[3])(int,int)={add,sub,div}; 这就是一个函数指针数组,在函数指针的基础上,只需加上[ ],表明他是一个数组。
函数 一个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.
9 8 7 6 5 4 3 2 1 0 8 9 7 6 5 4 3 2 1 0 8 7 9 6 5 4 3 2 1 0 7 6 5 4 8 3 2 1 0 9 8 7 6 5 4 3 2 9 1 0 8 7 6 5 4 3 2 1 9 0 7 6 5 4 3 2 1 8 0 9 8 7 6 5 4 3 2 1 0 9 7 6 5 4 3 2 1 0 8 9 这是第一趟 }; int arr2[] = { 2,3,4,5,6 }; int arr3[] = { 3,4,5,6,7, }; int* arr[] = { arr1,arr2,arr3 }; /
一、C语言的数据类型 1.数据类型的介绍 人与类聚,物与群分。C语言中,提供了丰富的数据类型来描述生活中的各种类型,所谓的类型,就是将具有相同特征的数据归类在一起。 bool 2.signed与unsigned关键字 在刚才介绍的数据类型中,我们可以看到有 signed 和 unsigned 这样的字眼,那么我们现在就来介绍一下这两个关键字 C语言用signed 的字符型变量 如果在变量名的后面赋值,那这个操作就叫做变量的初始化: int age = 10; double num_input = 23; char ch = 'X'; 2.变量的分类 对于变量,C语言中也有分类 = 0; c = b = a + 3;//连续赋值,从右向左依次赋值。 即b=a+3=9,c=b=9;,所以c最后的值为9 3.单目操作符 单目操作符,就是只对一个数据进行操作的操作符,有:++、--、+(正)、-(负) ++、--: “++”作用是让数据自增1;分为前置+
第一代程序员使用机器码 第二代程序员使用汇编 第三代程序员使用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)。
这就是数组名的含义我=我们不妨写一个代码来验证一下: #include<stdio.h> int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10}; printf 指针数组——是数组,是用来存放指针的数组;int*arr[5] (存放整型指针的数组) #include<stdio.h> int main() { int a=10; int b=20; int c= 30; int d=40; int e=50; //与其一个个用指针变量来存放abcde的地址还不如直接用一个指针数组来存放 int *arr[5]={&a,&b,&c,&d,&e}; return }; int arr2[] = {2,3,4,5,6}; int arr3[] = {3,4,5,6,7}; //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中 int* parr[3] = {arr1, arr2, arr3}; int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<5
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。 过去我们对于一个二维数组需要传参时,是这样写的: #include <stdio.h> 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 <stdio.h> 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"); }
新手C语言学习(3) 今天在牛客网写简单题的时候,一道计算五个数的平均数的题吸引了我,我以为很简单,但我却出现了很多的错误。 解题 #include <stdio.h> 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; } 其中
#include <stdio.h> 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语言中,二维数组可以看作是由多个一维数组组成的连续存储空间。
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] = {