c/c++程序设计涉及的一些知识点

c中的printf函数

main(){
int b = 3;
int arr[]= {6,7,8,9,10};
int * ptr = arr;
*(ptr++) += 123;
printf("%d,%d\n",*ptr,*(++ptr));
return 0;
}

输出 : 8,8

原因:printf函数计算参数是从右往左压栈的

c和c++的关系

  • c++ 语言支持函数重载,c语言不支持函数重载;
  • 函数在C++编译后在库中的名字和C语言的不同,假设某个函数原型是void foo(int x, int y)。该函数被C编译器编译后,在库中的名字是_foo,而在C++编译器中则会产生像_foo_int_int之类的名字。
  • C++提供了C连接交换指定符 extern "c" 解决名字匹配的问题。

指针和引用

区别:

  • 非空区别,在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象;
  • 合法性,在使用引用之前不需要测试它的合法性,相反,指针则应该总是被测试,防止其为空;
  • 可修改区别,指针可被重新赋值以指向另一个不同对象。但是引用则总是指向在初始化被指定的对象,以后不能改变,但是指向的对象的其内容可以改变
  • 应用区别,有存在不指向任何对象的可能和不同时刻会指向不同的对象等情况时,使用指针;如果总是指向一个对象并且指向一个对象以后就不会改变指向,那么应该使用引用。

传递动态内存

void swap3(int *p, int *q){
int *tmp;
tmp = p;
p = q;
q = tmp;//仅仅交换了指针的值,并没有改变两块内存的值
}
void swap4(int *p, int *q){
int tmp;
tmp = *p; //获取p指向内存的值
*p = *q;
*q = tmp;
}
void swap5(int &p, int &q){
int tmp;
tmp = p; //获取p指向内存的值
p = q;
q = tmp;
}

//------------

int t1 = 1,t2 = 2;
cout << t1 << ""<< t2 << endl;
swap3(&t1,&t2); //仅仅交换了指针的值,并没有改变两块内存的值
cout << t1 << ""<< t2 << endl;
// 后面两个函数分别用指针和引用交换成功
swap4(&t1,&t2);
cout << t1 << ""<< t2 << endl;
swap5(t1,t2);
cout << t1 << ""<< t2 << endl;

malloc 申请内存

void getMemory_err(char *p, int num){
p = (char *)malloc(sizeof(char )* num);
// 没有return 指针,不能传递动态内存
}
//返回指针变量
char *pGetMemory(char *p, int num){
p = (char *)malloc(sizeof(char )* num);
return p;
}
// 用指针的指针,
void getMemory(char **p, int num){
*p = (char *)malloc(sizeof(char )* num);
}

//------

char *str = NULL;
getMemory(&str,10);
strcpy(str,"hello"); char *str2 = NULL;
str2 = pGetMemory(str2,10);
strcpy(str2,"test"); cout<< *str <<endl;
cout<< str << endl;
cout<< &str << endl; cout<< *str2 <<endl;
cout<< str2 << endl;
cout<< &str2 << endl;

output:

h
hello
012FF774
t
test
012FF768

字符串变量存储问题

int a = 0; //全局初始化区
char *p1; //全局未初始化区
int _tmain(int argc, _TCHAR* argv[])
{
int b; //栈
char s[] = "abc"; //s在栈上, 常量区会存储一份"abc\0",用于共享,s[]初始化的时候拷贝过来放到栈上
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
const char *m = "123456"; //m在栈上, “123456” 在常量区
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456" 优化成一个地方。 cout << (m == p3 ? 1:0) << endl; // out 1,
cout << (p1 == p3? 1:0) << endl; // out 0;
cout << p1 << "———" << p3 << endl; // out 123456---123456 return 0;
}

//---

char *strA(){
char str[] = "hello world";
cout << "in str[] "<<endl;
cout << "before: "<< str << endl;
str[0] = 't';
cout <<"After:" << str << endl;
return str;
}
char *pStrA_err(){
char *str = "hello world";
cout << "in *str "<<endl;
cout << "before: "<< str << endl;
//*str = 'P'; // !!!!!!------runtime error 字符串常量保存在只读数据段
cout <<"After:" << str << endl;
return str;
}
char *pStrA(){
static char *str = "hello world";
cout << "in *str "<<endl;
cout << "before: "<< str << endl;
//*str = 'P'; // !!!!!!------runtime error ,字符串常量保存在只读数据段
cout <<"After:" << str << endl;
return str;
}

main:

char *c = strA();
char *c2 = pStrA_err();
char *c3 = pStrA(); cout << "After fun return:" << "--c:" << c << "--c2:" << c2 << "--c3" << c3 << endl;

output:

in str[]
before: hello world
After:tello world
in *str
before: hello world
After:hello world
in *str
before: hello world
After:hello world
After fun return:--c:@?--c2:hello world--c3hello world

结论:

  • 字符串数据保存在常量区,只读的数据段,不能直接修改
  • 函数内数组是局部变量,在函数内通过str[0] 可以修改。return之后,局部变量释放,

构造函数

class tA{
public:
int _a;
tA(){
_a = 1;
}
void print(){
printf("%d",_a);
}
};
class tB :public tA{
public:
int _a;
tB(){
_a = 2;
} };

//--

tB b;
tB b;
b.print(); // 在构造B类之前,先调用A的构造函数,在A类中_a =1,
printf("%d",b._a); // B类中 _a = 2;
return 0;

output: 12

在构造B类之前,先调用A的构造函数

malloc/free &&new/delete

  • malloc/free 是c++/c语言的标准库函数,new/delete是c++的运算符,它们都可以用于申请和释放动态内存
  • 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能执行构造函数和析构函数
  • c++语言中new运算符, 能完成动态内存分配和初始化工作; delete 运算符完成清理和释放内存工作

指针和句柄

  • 句柄和指针其实是两个截然不同的概念。
  • windows系统用句柄标记系统资源,隐藏系统的信息,它是一个32bit的uint。
  • 指针则标记某个物理内存的地址
  • 句柄可以看做是指向指针的指针。

this 指针

  • 本质上是一个函数参数,只是编译器隐藏起形式,语法层面的参数,this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针。 在python中直接显性给出
  • this指针在成员函数的开始前构造,在成员的结束后清除
  • this指针并不占用对象的空间, 只会占用参数传递时的栈空间,或者直接占用一个寄存器
  • this指针会因编译器不同而有不同的存放位置,可能是堆,栈,也可能是寄存器。
  • this指针只有在成员函数中才有定义。因此,在获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置(只有在成员函数中才有this指针的位置)

参考:

程序员面试宝典(第五版)

c/c++程序设计涉及的一些知识点的更多相关文章

  1. dbms_job涉及到的知识点

    用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...

  2. Http中涉及到的知识点总结

    1.URL地址 协议-> HTTP:超文本传输协议,除了用来传输文本,还可以传输HTML页面.CSS文件.JS文件.图片.音视频... HTTPS:SSL,它比HTTP更加安全一些 FTP:文件 ...

  3. 027 奥展项目涉及的javascipt知识点笔记

    1.获取指定div标签内的所有input标签 let inputs = document.getElementById("inspect-part1").getElementsBy ...

  4. Jquery的深浅拷贝涉及到的知识点

    1.安全的类型检测 Object.prototype.toString.call(obj) => "[object NativeConstructorName]" /** * ...

  5. 201521123082《Java程序设计》第4周学习总结

    201521123082<Java程序设计>第4周总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内 ...

  6. C语言程序设计第一次作业

    同学们,我们已经留了两次实验了,请大家将这两次的实验课内容写成实验报告在截止日期前进行提交. 截止日期:2016-10-7 23:00 实验一: 编程打印5行的倒三角形,第一行打印9个*,第二行7个* ...

  7. promise知识点汇总

    Promise对象被写进ES6的规范当中,提供的是另外一种更加友好的对于异步编程的解决方案,在这之前大多使用的是回调函数和事件来实现异步编程. 怎么来理解Promise对象呢?对于这个ES6新加入的小 ...

  8. 剑指Offer——搜狐畅游笔试题+知识点总结

    剑指Offer--搜狐畅游笔试题+知识点总结 情景回顾 时间:2016.9.24 10:00-12:00 地点:山东省网络环境智能计算技术重点实验室 事件:搜狐畅游笔试   注意事项:要有大局观,该舍 ...

  9. 剑指Offer——完美+今日头条笔试题+知识点总结

    剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...

随机推荐

  1. C++双向循环链表实现

    双向循环链表C++实现 1.单链表: 结构图: 2.双向链表: 3.双向循环链表: 对于本程序中,则是给定一个_head  头结点,而不是指针,因为这样更加方便避免一些空判断问题 /* 版权信息:狼 ...

  2. Ansible 手册系列 二(安装)

    通过yum(CentOS, RHEL)安装 系统版本: CentOS7.2 yum install ansible -y 通过pip安装 安装easy_install # 安装easy_install ...

  3. C# 设计模式巩固 - 抽象工厂模式

    前言   继续工厂模式高级版,抽象工厂模式.抽象工厂模式其实是从工厂方法模式拓展而来.在实际的生活中一个工厂的产品不可能是单一的,肯定是多种系列的产品. 介绍 - 抽象工厂模式 定义:(摘自百度百科~ ...

  4. Unity 3D 无法显示中文的解决方法

    大家开始用unity3D时想必都会遇到一个问题,使用中文时会乱码.这是由于编码方式不同导致的,具体解决方法如下: 程序写代码什么的最好下个像Notepad++类似的工具,这里使用Notepad++修改 ...

  5. ES常见名词定义

    集群:具有相同clusterName的节点.节点:一个ES实例,并不定是一个节点,因为一个节点上可以启动多个ES实例.索引:相当于数据库database的概念,一个集群可以包含多个索引.分片:索引可以 ...

  6. 浅析C#中ASP.NET页面的生存周期

    一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 阶段 说明 页请求 页请求发生在页生命周期开始之前.用户请求页时,ASP.NET ...

  7. RMI垃圾收集简介

    和单机系统类似, 分布式系统也需要自动清除不再有客户端引用的对象(remote object). 远程对象的自动垃圾回收机制, 将程序员从深坑中解放出来, 不再需要人工跟踪client所引用的对象了. ...

  8. Java 进阶巩固:什么是注解以及运行时注解的使用

    这篇文章 2016年12月13日星期二 就写完了,当时想着等写完另外一篇关于自定义注解的一起发.结果没想到这一等就是半年多 - -. 有时候的确是这样啊,总想着等条件更好了再干,等准备完全了再开始,结 ...

  9. 【剑指offer】连续子数组的最大和,C++实现

    原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 # 题目       输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...

  10. c++ rapidjson解析多层级json

    如果一个层级为data,其内部又包含一个层级status, 可以直接通过这种方式来跨级访问: rapidjson::Value& val_status = doc["data&quo ...