随笔分类 -  C/C++基础

学习C语言的同时,增加用C来描述算法的能力。C语言尽量在Linux上写。
摘要:前面详细的说了,C函数调用的过程中,栈的变化情况的原理部分,这里在看一下汇编代码的真正的实现。有关前面的那一片博客,主要记住的就是函数调用时栈的变化,4+3+2的步骤:(1)设置栈帧边界(2)开辟本函数的局部区域(3)保存寄存器的内容(4)初始化局部区域(int3)(5)如果有函数调用(a)push... 阅读全文
posted @ 2015-04-14 17:33 stemon 阅读(569) 评论(0) 推荐(0)
摘要:这篇blog试图说明这么一个问题,当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。这些细节跟操作系统平台及编译器的实现有关,下面的描述是针对运行在Linux的gcc编译器而言的。c语言的标准并没有描述实现的方式。所以,不同的编译器、不同的操作系统都可能有自己的建... 阅读全文
posted @ 2015-04-14 11:21 stemon 阅读(1000) 评论(0) 推荐(0)
摘要:在说这个问题之前,先说两个需要知道的背景知识:(1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值。(2)C++引用的实现是在符号表中动了手脚,把自己的变量符号对应的内存地址写成了它所引用的那个变量的内存地址了。(3)C++的cout函数的执行... 阅读全文
posted @ 2015-04-13 02:37 stemon 阅读(11068) 评论(0) 推荐(0)
摘要:背景知识在开始之前先说一下符号表,这个编译器中的东西。下面看一下百度百科中的描述:符号表是一种用于语言翻译器中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址。符号表在编译程序工作的过程中不断收集、记录和使用源程序中一些语法符号的类... 阅读全文
posted @ 2015-04-11 17:32 stemon 阅读(556) 评论(0) 推荐(0)
摘要:前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字。C/C++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别的memory barrier。下面这句... 阅读全文
posted @ 2015-04-10 14:38 stemon 阅读(666) 评论(0) 推荐(0)
摘要:前言前几天女票问了我一个阿里的面试题,是有关C++语言的const常量的,其实她一提出来我就知道考察的点了:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read... 阅读全文
posted @ 2015-04-09 02:46 stemon 阅读(2842) 评论(10) 推荐(2)
摘要:结构体内存地址对齐概念内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的(在32位系统中,数据总线宽度为32,每次能读取4字节,地址总线宽度为32... 阅读全文
posted @ 2015-03-27 17:34 stemon 阅读(934) 评论(0) 推荐(0)
摘要:基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度:32位编译器中各基本类型所占字节数:注:对于32位的编译器,指针变量的大小都是4个字节,也就是32位。原因是32位的寻址空间,也就是每个存储单元的地址都是32位的。指针变量中... 阅读全文
posted @ 2015-03-27 15:13 stemon 阅读(4353) 评论(0) 推荐(0)
摘要:先来分析指针这个东东:从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 上面的图表示了程序运行时变量的值和地址,这时的内存长什么样子呢?注意指针是一个变量,它当然有内存空间,里面存的就是一个地址,通过这个地... 阅读全文
posted @ 2014-12-15 15:01 stemon 阅读(1161) 评论(0) 推荐(0)
摘要:当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。例十五:float f = 12.3;float *fptr = &f;int... 阅读全文
posted @ 2014-12-09 15:10 stemon 阅读(302) 评论(0) 推荐(0)
摘要:看下面的例子:例十八:char s = 'a';int *ptr;ptr = (int *)&s;*ptr = 1298;指针ptr 是一个int *类型的指针,它指向的类型是int。它指向的地址就是s 的首地址。在32 位程序中,s 占一个字节,int 类型占四个字节。最后一条语句不但改变了s 所... 阅读全文
posted @ 2014-12-09 15:00 stemon 阅读(477) 评论(0) 推荐(0)
摘要:50条忠告:(其中有几条觉得写的不够贴切,所以删了,发了余下的部分)1.把C++当成一门新的语言学习;2.看《Thinking In C++》,不要看《C++变成死相》;3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不... 阅读全文
posted @ 2014-12-09 14:54 stemon 阅读(237) 评论(0) 推荐(0)
摘要:原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426增加自己的想法,作为笔记。1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并... 阅读全文
posted @ 2014-12-09 14:26 stemon 阅读(246) 评论(0) 推荐(0)
摘要:可以把一个指针声明成为一个指向函数的指针.int fun1(char *,int);int (*pfun1)(char *,int);pfun1 = fun1;int a = (*pfun1)("abcdefg",7); //通过函数指针调用函数。可以把指针作为函数的形参。在函数调用语句中,可以用指... 阅读全文
posted @ 2014-12-09 13:28 stemon 阅读(272) 评论(0) 推荐(0)
摘要:可以声明一个指向结构类型对象的指针。struct MyStruct{ int a; int b; int c;};struct MyStruct ss = {20,30,40};//声明了结构对象ss,并把ss 的成员初始化为20,30 和40。struct MyStruct *p... 阅读全文
posted @ 2014-12-09 13:08 stemon 阅读(233) 评论(0) 推荐(0)
摘要:在谈论指针之前,永远记住指针的四要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区... 阅读全文
posted @ 2014-12-09 11:49 stemon 阅读(387) 评论(0) 推荐(0)
摘要:原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6646001增加自己的想法,作为笔记。这里&是取地址运算符,*是间接运算符。&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,... 阅读全文
posted @ 2014-12-09 10:30 stemon 阅读(228) 评论(0) 推荐(0)
摘要:现在到揭露数组名本质的时候了,先给出三个结论:(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!数组名可... 阅读全文
posted @ 2014-12-08 10:54 stemon 阅读(246) 评论(0) 推荐(0)
摘要:数组和指针,原本不想在写了,觉得这部分差不多了,但是自己在写程序的时候还是发现了一个错误。首先说一下我的要求:给一个函数传递一个二维数组,然后我想在这个函数里面计算这个数组的行数。写个类似的错误DEMO代码弄上来:#include #include void func(int a[][3]){pri... 阅读全文
posted @ 2014-12-06 18:03 stemon 阅读(226) 评论(0) 推荐(0)
摘要:前面写了一些C指针和数组的一些知识,但是还有一些很重要的知识没有交代,这里做一个补充。首先看一下,普通变量(指针也是变量)和数组名查看地址的方式是不同的。查看数组变量的地址,不需要使用&。C,C++语言中,对数组变量的操作,就相当于直接对该数组变量的地址的操作。#include#includeint... 阅读全文
posted @ 2014-12-05 18:01 stemon 阅读(295) 评论(0) 推荐(0)