2、c语言基础学习02

=============================================================================
将windows的可执行文件上传到linux,看能够执行吗?
sftp> put a.exe

出现下面错误:没有权限;拒绝访问
-bash: ./a.exe: Permission denied
那我们提升下a.exe的权限试试
chmod u+x a.exe
则出现下面错误:不能执行二进制文件:执行格式错误
-bash: ./a.exe: cannot execute binary file: Exec format error
说明windows的可执行文件不能再linux系统下执行

fatal error 致命错误

=============================================================================
#include的意思是头文件包含,使用c语言库函数需要提前包含所用到的库函数对应的头文件
c语言中如果要用到printf函数,在使用前必须 #include <stdio.h>
-----------------------------------------------------------------------------
include有两种用法:
1、#include <文件名> 说明需要包含的文件在系统目录下
2、#include “文件名” 说明需要包含的文件在当前目录下
-----------------------------------------------------------------------------
可执行代码必须放在{}大括号里面
; 在c语言中一行只写一个分号是可以的,表示是空语句
c语言中一组大括号里也可以再有多组大括号
-----------------------------------------------------------------------------
int a;      //定义一个变量
extern int b;  //声明一个变量
-----------------------------------------------------------------------------
C语言自定义名字的要求:
可以使用大小写字母、下划线、数字,但第一个字母必须是字母或者下划线
且字母区分大小写。(注意:BASIC语言不区分大小写)
-----------------------------------------------------------------------------
printf 是c语言库函数,功能是:向标准输出设备输出一个字符串
(注意:标准输出设备不仅仅指的是屏幕,还有打印机等等什么的)
可以通过命令 man 3 printf 来查看
-----------------------------------------------------------------------------
编译错误有两种
warning 不影响编译,只是警告
error 编译器彻底罢工了,不干活了
-----------------------------------------------------------------------------
int main()
{
  return 0;
}

void main()
{
  return ; //或者可以这句话不用写
}

对c语言,两种写法都对,但对于C++来讲,只支持第一种写法
-----------------------------------------------------------------------------
在main函数中
return 0;    代表程序执行成功,
return -1;   代表程序执行失败。
-----------------------------------------------------------------------------
c语言文件的扩展名是.c,C++文件的扩展名就是cpp

linux系统并不用后缀名来区分文件;
Linux不像Windows一样区分文件后缀的,所以是可以改的,而且不影响使用的。
1,mv可以移动文件,也可以用作更改文件名。
2,修改命名:mv fileName.type fileName.newType就可以更改文件后缀了。
3,但是一些特定的文件不要随意更改,例如配置文件。

=============================================================================
在使用system之前需要包含stdlib.h这个头文件,
调用system函数,可以在c语言的代码中执行另外一个程序
-----------------------------------------------------------------------------
如果在命令行执行一个程序,那么这个程序的调用者就是操作系统;如果在代码中通过system
执行一个程序,那么这个程序的调用者就是自己写的代码本身。
c语言所有的库函数调用,只能保证语法是一致的,但不能保证执行结果是一致的,
同样的库函数在不同的操作系统下执行结果可能是一样的,也可能是不一样的。

不同平台下的c语言的库函数只能保证调用语法一样,但不能保证执行结果也是一样的
(因为c语言对硬件的要求、对操作系统的要求太多啦)
所以用C语言在不同的平台写代码的时候,可能会有一些移植的工作量。
-----------------------------------------------------------------------------
POSIX是一个标准,只要符合这个标准的函数,在不同的系统下执行的结果就可以一致。
如果有符合posix标准的函数,尽量使用。

Unix和Linux很多库函数都是支持POSIX的,但windows支持的比较差。(曾经微软说过要表示大力支持,但说得多做得少!)
所以说,如果将Unix代码移植到Linux一般代价很小,如果把windows代码移植到Unix或者linux就比较麻烦。
-----------------------------------------------------------------------------
system 返回的是一个整数
system的返回值就是所被调用程序中main函数的return的值

=============================================================================
c语言编译过程
1、预编译 --> 2、编译 --> 3、链接
-----------------------------------------------------------------------------
预编译命令:
gcc -o cc1.c c1.c -E 或者 gcc -o cc1.c -E c1.c
(注意:-o 作用是指定输出文件的名字,如果不加-o的话,则生成的文件名字总叫a.out)
预编译c1.c,预编译之后得到的文件名字叫cc1.c
(注意:编译后的名字可以随意起,但是呢我们知道预编译后的文件还是文本的.c文件,所以为了好区分起名字为 xxx.c)
在c语言中#开头的语句又叫预编译指令
#include <stdio.h>
预编译的功能之一:会把include包含的头文件内容做一个简单的替换,即替换到.c文件里面去。
......
//此处省略1万行
......
预编译的功能之二:会把代码中的注释去掉。
-----------------------------------------------------------------------------
编译的命令:
gcc -o cc1.o cc1.c -c 或者 gcc -o cc1.o -c cc1.c
编译cc1.c,编译之后得到的文件名字叫cc1.o
编译的功能是:把文本的c语言编译为二进制指令。
-----------------------------------------------------------------------------
链接的命令:
gcc -o c1 cc1.o (注意:gcc没有单独的链接参数)
将系统库函数与cc1.o进行链接(简言之合并),得到可执行的程序,该程序的名字叫c1

我们想知道在linux系统下到底链接来了什么库来呢?(即可执行程序需要用到什么库尔呢?)
使用命令 ldd c1 查看
(注意;用c语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包)
那么在windows系统下的可执行程序需要用到什么库呢?
使用一个小软件Depends.exe可以查看的到

=============================================================================
操作系统结构
1、用户模式
我们目前写的程序都是在用户模式下运行的。
2、内核模式
操作系统本身、设备驱动等这些软件是在内核模式下运行的。
-----------------------------------------------------------------------------
一个CPU的一个寄存器可以放8个二进制位
例如:
0000 0000
1111 1111
则这个CPU就是8位的CPU
-----------------------------------------------------------------------------
一个CPU的一个寄存器可以放16个二进制位
0000  0000  0000  0000
1111   1111   1111  1111
则这个CPU就是16位CPU
-----------------------------------------------------------------------------
总线有三种:数据总线、地址总线、控制总线
总线在大多数时候和CPU的寄存器位数是相同的

8位CPU的总线是8位
1111 1111
f    f
256BYTE(255字节)

16位CPU的总线是16位
1111 1111 1111 1111
f   f   f   f
65536BYTE(64k字节)

32位CPU的总线是32位
1111 1111 1111 1111 1111 1111 1111 1111
f   f    f   f   f   f   f   f
32位CPU管理内存有一个最大值,4G字节 = 4 x 1024M = 4 x 1024 x 1024 x 1024Byte(字节)

64位CPU的总线是64位
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
f    f    f   f    f    f     f     f     f    f      f     f    f   f     f   f
理论上64位CPU管理内存是:2^64个字节,但同时又取决于综合的指标:比如主板、操作系统的支持等等。
但至少是远远大于4G的。

如果寄存器是64位,但总线是32位,这种cpu叫准64位CPU。
(即里面可以做到很宽,但是外面的工艺却达不到)

若在64位的CPU架构上运行了64位的软件操作系统,那么这个系统是64位的;
若在64位的CPU架构上运行了32位的软件操作系统,那么这个系统是32位的。
-----------------------------------------------------------------------------
指令集中的cpu架构
精简指令集RISC(服务器端用的)比如:SPARC、ARM属于精简指令集

复杂指令集CISC(比如Inter的CPU)比如:X86属于典型的复杂指令集
-----------------------------------------------------------------------------
cpu内部里面所有的计算都得在寄存器里面来完成。

cpu内部的寄存器还有名字哦:
8位cpu(x86构架)    16位CPU   32位CPU   64位CPU
a           ax,al,ah      eax       rax
b           bx,bl,bh        ebx               rbx
c           cx          ecx               rcx
d           dx       edx     rdx
-----------------------------------------------------------------------------
使用Qt时,再用到system函数时,会出现一个控制台的窗口。
为什么呢?
答:因为system函数在windows系统下就是一个基于控制台的函数(就是字符界面的函数),所以即使在图形界面下调用system也会出现一个控制台窗口。
那么如何在图形界面下调用该函数又不显示控制台呢?
答:可以换另外一个函数啊!该函数是 WinExec("notepad",SW_NORMAL); 但是该函数需要包含一个头文件是 #include <windows.h>

QT常用快捷键
Ctrl + I        自动格式化代码
Ctrl + /     注释代码/取消注释代码
Ctrl + r    不调试运行代码
Ctrl + b    编译代码但不运行代码
Alt + enter    自动完成类函数定义
F9           设置断点
F5      调试运行
F10       next调试
F11       step调试
-----------------------------------------------------------------------------
vs常用快捷键
Ctrl + F5             不调试运行代码
Ctrl + k,Ctrl + f      自动格式化代码
Ctrl + k,Ctrl + c     注释代码
Ctrl + k,Ctrl + u     取消注释代码
Ctrl + Shift + b        编译,不运行代码
F5           调试运行
F9                     设置断点

注意:C语言以分号结尾的,而不是以行结尾的。
=============================================================================

时间: 2024-10-12 07:22:44

2、c语言基础学习02的相关文章

C语言基础学习5:字符串与指针

1.字符串的表示形式 (1)用字符数组存放一个字符串,然后输出该字符串. char string[] = "I am happy"; printf("%s",string); (2)用字符指针指向一个字符串. char *string = "I am happy"; printf("%s",string); 2.字符指针作函数参数 (1)用字符数组作参数 void CopyString(char from[], char to

C语言基础学习3:数组与指针

数组元素的指针就是数组元素的地址. 1.指向数组元素的指针 C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址. int a[10]; int *p1,*p2; p1 = &a[0]; p2 = a; p1和p2指向同一个数组a[10]. 2.通过指针引用数组元素 按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1. 如果p的初值为&a[0],则 (1)

C语言基础学习3:指针

1.地址和指针的概念 一个变量的地址成为该变量的“指针”. 如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”,指针变量的值(即指针变量中存放的值)是地址(即指针). 指针是一个地址,而指针变量是存放地址的变量 2.变量的指针和指向变量的指针变量 2.1指针变量的定义 指针变量的定义:基类型 *指针变量名: int a; int *pointer; pointer = &a; 2.2指针变量的引用 指针变量中只能存放地址,不能将一个整数赋给一个指针变量. “&”和“*

C语言基础学习2:字符数组

在C语言的基本数据类型中没有没有字符串变量,一般以字符数组的形式给出. 1.字符串数组的初始化 char c[] = {'I', ' ', 'a', 'm', 'h', 'a', 'p', 'p', 'y'}; char c[] = "I am happy"; 区别:第一种方式字符串长度为10,内存中占10*sizeof(char)个字节,第二种方式是以字符串形式表示,有一个字符串结束字符'\0',内存中占11*sizeof(char)个字节. 2.字符数组的输入输出 %c,一个一个字

C语言基础学习7:返回指针值的函数

一个函数可以返回一个整型值.字符值.实型值等,也可以返回指针型的数据,即地址,返回的是指针类型. 返回指针值的函数的一般定义形式为; 数据类型 *函数名(参数列表) 例如: int *a(int x, int y); a作为函数名,调用它之后能得到一个指向整型数据的指针(地址). ()优先级高于*,因此a先与()结合,这是函数形式,返回值为指针形式. 1 #include <stdio.h> 2 float *search(float (*pointer)[4]); 3 float *sear

C语言基础学习8:指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,指针数组中的每一个元素都相当于一个指针变量. 一维指针数组的定义形式为: 类型名 *数组名[数组长度]: 例如:int *p[4]; []的优先级比*高,因此p先与[4]结合,形成p[4]形式,这是数组形式,然后再与p前面的"*"结合,"*"表示此数组是指针类型的,每个数组元素都可指向一个整型变量. 为什么要用到指针数组呢? 因为它比较适合于用来指向若干个字符串,使得字符串处理更加灵活. 1 #include <

C语言基础学习9:指向指针的指针

一般形式: 基类型 **变量名: 例如:char **p; void main() { char *name[] = {"Follow me","Basic","Great Wall","FORTRAN","Computer design"}; char **p; int i; for(i=0;i<5;i++) { p = name + i; printf("%s\n",*p);

C语言基础学习1:格式输出

1.字符数据的输入输出 putchar函数:向终端输出一个字符. 使用形式:putchar(c); getchar函数:从终端输入一个字符. 使用形式:c = getchar(); 2.格式输入输出 2.1 printf函数:向终端输出若干个任意类型的数据. 一般格式:printf(格式控制,输出表列). 2.1.1 d格式符 %d     按十进制整型数据的实际长度输出. %md  m为指定的输出字段的宽度,如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出. %ld    输出

C语言基础学习笔记

--C语言框架-- 数据  字节byte          字符   char         8  半字half word     短整型        short int    16    字word            整型   int(integer)   32               长整型   long int     32                 单精度   float        32   双字(double word) 双精度  double       64