摘要:在C语言和C++中,指针是非常重要的一部分,程序的执行过程中可以通过指针来找到要操作的数据和可执行的函数代码。很多人就明白指针和地址是有区别的,但是很少有人能说清楚这种区别。 指针总共可以分为两种,函数指针和数据指针。而指针和地址最大的区别就是指针是有类型的,地址是没有类型的。我们当然可以通过绝对地址的方式找到函数和数据,但是地址是没有类型的,不能对地址进行算术操作,在涉及诸如数组等操作时就不能通过地址的自增和自减来访问数组的各个变量。但是通过对指针的引用,就可以通过对指针进行一系列的加加减减操作很方便的访问数组的各个元素。 所以,指针是由地址和类型两部分构成的,指向数据的指针不仅记录...
阅读全文
摘要:在课堂上听到了一个关于inline的例子,关inline函数的执行效率的问题。在课后根据回忆编写了一下,可以看出inline函数的执行效率确实比普通的函数要高.废话不说,上代码:调用内联函数:#include <iostream>using namespace std;inline void delay(){ int a; for(long int i=0;i<10000;i++) a=0; }int main(){ for(long int i=0;i<10000;i++) delay(); cout<<"Which one is long?&q
阅读全文
摘要:最近在课堂上听到老师讲了C语言中的内存分配,感觉挺深刻的,于是就写下来,当做是对自己的提醒! 微机原理的知识告诉我们,内存大致可以分为三部分:代码区 、堆栈区、数据段(我的计算机学的不好,按照自己的理解)。C和C++中有全局变量,静态变量以及局部变量等几类。全局变量和静态变量是在编译的时候就已经分配好在数据段,也就是说在执行main函数之前就已经分配好了地址,如果定义的时候认为初始化,那么就存放初始化的值,如果没有初始化,则由编译器初始化为0。这就说明在整个程序的执行过程中全局变量和静态变量的地址和类型不会发生变化,可能变化的只是他的值。 对于动态变量,则在编译的阶段并不分配内存,而是执行..
阅读全文
摘要:【转】关于main函数2008-03-13 10:39:33|分类: 学习空间 |字号订阅来自:http://blog.csdn.net/jylnn/archive/2008/03/08/2158429.aspxC的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从main()函数开始执行的。一、main()函数的形式 在最新的 C99 标准中,只有以下两种定义方式是正确的:int main( void )--无参数形式 { ... return 0; } int main( int argc, char *argv[] )--带参数形式 { ... retur
阅读全文
摘要:这两天用结构模拟面向对象的方法在C语言中编写硬件的驱动程序,涉及到多文件的变量的初始化问题。如下:在DS1302.h中定义了一个结构:typedef struct{ void (*fun1); void (*fun2); }DS1302_T; extern DS1302_T ds1302; 并声明了一个全局变量以供main函数所在的main.c文件调用,并在DS1032.c中定义该变量: DS1302_T ds1302; 随后在DS1032.c中初始化: ds1302={fun1,fun2};//其中fun1和fun2为之前定义好的函数,作为结构成员。但在初始化之前却...
阅读全文
摘要:[原创]关于C语言中函数调用和参数传递机制的探讨关于C语言中函数调用和参数传递机制的探讨函数,相信许多人也知道其重要性;一个文件往往由一个或者多个函数构成的。然而可能许多人还不知道函数调用的一些深层问题,所以我写的这篇文章一来是应了一个好朋友的要求而写,二来希望一些朋友能够从我这篇文章了解函数调用的机制。但是并不是每个人都可以完全读懂这文章,想完全读懂此文,我想必须具备三个条件:一、对于C语言有一定的了解,最起码有一个整体的初步了解;二、能够读懂UNIX/LINUX下的AT&T语法的汇编;AT&T汇编与Intel汇编的差别还是挺大的;这个条件可能一些人就不具备了,但是你通过阅读此文相信也能对函
阅读全文
摘要:在FPGA中涉及到管脚的多功能选择:某些管脚既可以分配为普通的IO管脚,也可以分配为编程引脚。默认的话这些特殊的引脚做作为编程引脚,如果要想把这些引脚作为普通的IO口来使用的话,必须在FPGA的开发工具中进行设定,将其选择为普通的IO口,否则会出现如下错误:Error: Can't place multiple pins assigned to pin location Pin_30 (IOC_X0_Y8_N0) 上述错误就是由于把管脚30当做普通的IO口,而开发工具又将其当做编程引脚,这样就会引起冲突。一般出了在需要使用到编程引脚的功能外,都应该显式的把这些具有特殊功能的引脚设定为普
阅读全文
摘要:在编写C语言和C++程序的时候,经常会为了一些查不出原因的错误头疼,仿佛感觉自己想破脑袋也不知道错在哪里。今天就又遇到了这个问题,而且不是第一次。 在NIOS IDE下用C语言开发串口程序,有一条语句是用来设置波特率的: UART->DIVISIOR.WORD=(unsigned long int)(CLOCK/num+0.5); 编译器在编译的时候在该处报错:严重的error before “;”; 当时想破脑袋也看不出来这句话错在哪里,只好硬着头皮将所有的头文件和源文件重新看一遍,不经意间注意到对CLOCK的预定义为:“ #define CLOCK 100000000;” 突然恍然大
阅读全文
摘要:最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比较模糊的,只是之前的使用大多比较简单,并没有牵涉到太复杂的工程,所以定义和声明还是比较简单而明了了的.但是最近的大工程让我在这方面吃到了一点点苦头,虽然看了别人的代码能够很快的改正,但是这些改正背后的原因却不知道.我想大多数喜欢C语言的程序员应该是和我一样的,总喜欢去追究程序问题背后的底层原因,而这也恰恰是我喜欢C语言的最根本的原因.今天看过janders老兄在csdn上的一篇文章后,理解的确加深
阅读全文
摘要:在多文件组织中,一个源文件难免会使用另一个源文件的一个函数或变量或者结构,这时就需要将该变量或者结构、函数用extern在头文件中声明为外部的,以便其他文件调用。注意一个文件的.h头文件声明了一个外部变量时,如需要给出其定义,这需要在其.c或.cpp文件中给出具体实现方法。这时切不可犯如下低级错误:.h文件中:extern int a;.c文件中:a=10;这样编译器会报错,原因是.h文件中只是对外部变量进行声明,而不是定义,所以直接使用未经定义的变量则会出错。
阅读全文
摘要:一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、文字...
阅读全文
摘要:初级内容,高手略过,下面直奔主题-------------include指令会将包含的文件内容展开在include指令的位置,通常我们用这个指令引入各种头文件。某本“通俗易懂”的书在讲解这个预处理指令的时候举了一个包含.c文件的例子并因而被鄙视。那么为什么正常情况下不应该用include指令包含一个源文件呢?要弄明白这个问题需要对C语言的编译方式有所了解。C语言的编译方式是分离式的,分为两步(假设只有一个生成目标):1、将一个或多个源文件编译成可重定位的目标文件,其中每个文件是分别编译的。2、将1步生成的可重定位目标文件链接成一个可执行目标文件或者共享目标文件。假设foo1.c中用includ
阅读全文
摘要:C++中有多种存储器说明符,如auto、register、static、extern、mutable以及volatile等。如果从事嵌入式行业硬件等工作,则需要对volatile这个存储器说明符有深刻的理解,需要知道什么时候改用它声明变量。 volatile,意如其名:易变的,易挥发的。它表明:即使程序代码未对内存单元进行修改,其值也可能发生变化。对于学习软件的人来说,这是否不可理解,对于稍微有点硬件知识的人,则很好理解。例如:串口接收数据,则有可能是硬件接收数据而不是软件改变数据。或者两个程序共享数据,另一方程序可能单方面修改内存数据。所以需要重新读取内存的数据才能保证不出错误。而如果不..
阅读全文