c语言从编译到运行
装
入
的
三
种
方
式
(
逻
辑
地
址
到
物
理
地
址
的
转
换
)
:
1.
绝
对
装
入
2.
静
态
重
定
位
3.
动
态
重
定
位
装入的三种方式(逻辑地址到物理地址的转换):\\ 1.绝对装入\\2.静态重定位\\3.动态重定位
装入的三种方式(逻辑地址到物理地址的转换):1.绝对装入2.静态重定位3.动态重定位
项目 | Value | Value |
---|---|---|
绝对装入 | 编译时产生绝对地址 | 单道程序,在一个计算机系统中一次只能支持 一个用户程序的运行 |
静态重定位 | 装入时确定物理地址 | 早期批处理操作系统 |
动态重定位 | 运行时确定物理地址 | 现代操作系统 |
条件编译
#if 0 … #endif 属于条件编译,0 即为参数。
#if condition
code1
#else
code2
#endif
这种形式对程序调试也可以帮助,测试时使用 #if 1 来执行测试代码,发布后使用 #if 0 来屏蔽测试代码。
c 调用另一个文件的函数
单片机控制文件的分层:
新建.h文件:
/*源文件.cpp*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxsize 100
#include"排序.h"/*不是库函数使用双引号包含*/
int main()
{
test();
}
/*排序.h:if写法有点像MATLAB*/
#ifndef SORT/*如果标号没有被定义*/
#define SORT
void test();
#endif
void test();/*直接这样写也行,不过其他文件再调用时系统会进行重新定义*/
/*排序.cpp*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"排序.h"/*不是库函数使用双引号包含*/
void test()
{
printf("在.h文件中声明的函数");
}
括号表达式
printf("%d",(1,2,3,100));
位移
System.out.println(2<<3);//java语言
输出为16
二进制2=10
10向左移动三位是10 000
共用体union:共享同一段内存的结构体
下例表示声明一个共用体uni:
union uni{/*“共用”类型“FOO”*/
int a;
char b;
double c;
};
C++中的.和::和:和->的区别
可以看出 & 和 && 在判断语句中都可以实现“和”这个功能
VS2010常见的报错处理
表达式必须包含类类型:
将.换成->(*G.)
error C2039,报错;不是类成员
− 关闭VS,重新打开…
无法打开文件“C:…\xxxx.exe”
错误原因:项目在在打开前已经打开了win32里面的程序,并且运行。 解决方法:关闭直接在win32中运行的程序,再点击调试
vs2019无法打开源文件"iostream"
可参考知乎回答,如果其他的文件能正常引入的话,可以选择粘贴源文件到新建项目
参考:
https://www.cnblogs.com/xian-yongchao/p/9506176.html
https://www.zhihu.com/question/329248057
https://www.runoob.com/cplusplus/cpp-comments.html
动态内存分配:
项目 | Value |
---|---|
int square(int num){int sq = num* num;return sq; } | 子程序参数num和局部变量sq在栈区 |
int a= 0; | 全局变量a在全局初始化区 |
char *p1; | 全局变量p1在全局未初始化区 |
main({int num=20; char *p2,*p3 = “123456”; | 局部变量num, p2, p3在栈区,字符串常量12345610在常量区 |
int a[]= {1,2,3}; | 数组a(存储了3个整数)在栈区 |
static int c =0; | c在全局(静态)初始化区 |
p1 = (char *)malloc(10); p2 = (char *)malloc(20); | 分配得到的10和20字节的区域就在堆区 |
strcpy(p1, “123456”); | 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方 |
printf('square = %d",square(num)); | 系统中存储在堆区的量不会由系统自动释放 |