C语言
文章平均质量分 93
ly0303521
这个作者很懒,什么都没留下…
展开
-
C语言 编译、链接、全局变量
1 编译问题: 就是你的代码要能够编译通过,编译主要是对语法的检查。例如: 1 A文件用B文件里的函数问题:在C语言中,A文件用B文件的函数,缺省不用做任何说明(缺省就是全局函数,注意不能是static函数,当然建议写上extern的引用说明)。 2 但是如果A文件要用B文件的结构体。那么必须把结构体放到头文件里,两个源文件都include。原创 2014-08-04 18:16:37 · 887 阅读 · 0 评论 -
C语言中关键字restrict的用法(linux 为 __restrict)
类型限定词restrict关键字restrict通过允许编译器优化某几种代码增强了计算支持。它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式。为了清楚这样做为何有用,我们需要看一些例子。考虑下面的代码:int ar[10];int * restrict restar = (int *) malloc(10 * sizeof(int));int * par = ar;转载 2015-09-02 15:21:07 · 17180 阅读 · 0 评论 -
如何计算时间复杂度
一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa ! =0时,时间复杂度就是O(2^n);a=0,bO(n^3);a,b=0,cO(n^2)依此类推eg:(1) for(i=1;i //循环了n*n次,当然是O(n^2) f转载 2015-09-28 17:24:51 · 391 阅读 · 0 评论 -
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL gcc编译不能通过
UL 就是unsigned long 的缩写编译器一般会编译通过如果不行的话那可能就是编译器不够“聪明”因此换成#define SECONDS_PER_YEAR (60UL * 60UL * 24UL * 365UL)或者#define SECONDS_PER_YEAR ((unsigned long)(60 * 60 * 24 *原创 2015-11-03 21:37:48 · 4225 阅读 · 0 评论 -
Linux内核 container_of 宏和 offsetof 宏分析
1、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )宏功能:获得一个结构体变量成员在此结构体中的偏移量。1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;3. &( ( (TYPE *)0 )->MEMBER )取出转载 2015-10-12 11:08:47 · 375 阅读 · 0 评论 -
C 语言中 typeof 关键字简介
原文:http://hi.baidu.com/leowang715/blog/item/b0b96d6f972e7dd080cb4a06.htmltypeof关键字是C语言中的一个新扩展。只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别:声明函数声明符中的参数类型链表和返回类型类型定义类型操作符ssi转载 2015-10-12 11:36:22 · 535 阅读 · 0 评论 -
offsetof与container_of宏[总结]
1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认转载 2015-10-12 12:56:25 · 390 阅读 · 0 评论 -
c语言声明 void (*signal(int sig, void(*func)(int)))(int)
中间部分 :signal( int sig, void (*func)(int))signal函数有2个参数,第一个是int,第二个是无返回值,带一个int参数的函数指针外围:void (*signal(xxx)) (int)signal函数返回的是一个函数指针,无返回值,有一个int参数简化:typedef void Sigfunc(int)Sig转载 2015-11-01 22:43:11 · 2268 阅读 · 0 评论 -
va_list原理及用法
VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。下面是va_list的用法示例 :#include int AveInt(int,...); void main(){转载 2015-11-02 18:56:53 · 698 阅读 · 0 评论 -
深入C语言内存区域分配(进程的各个段)详解
一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件C语言可执行代码结构名称内容代码段可执行代码、字符串常量数据段已初始化全局变量、转载 2015-11-19 23:03:46 · 502 阅读 · 0 评论 -
获取exe程序路径
char exePath[LEN_PATH]={0};GetModuleFileName(NULL,exePath,LEN_PATH); // 得到exe文件的绝对路径strrchr( exePath, '\\')[0]= '\0';printf("exePath: %s\n",exePath);exePath 为程序入口的路径比如test1:int main(){原创 2016-09-10 09:04:45 · 649 阅读 · 0 评论 -
C语言 指针、结构体、数组
MD5_CTX MD5; MD5Init(&MD5); printf("MD5: %x \n", MD5); printf("&MD5: %x \n", &MD5); printf("MD5: %p \n", MD5); int data = 123; MD5Update(&MD5, &data, 4); unsigned char rsl[16]; unsigned char原创 2017-03-08 10:20:53 · 475 阅读 · 0 评论 -
printf输出指定长度字符串
原文:http://blog.csdn.net/q345852047/article/details/8217634编程时往往存在这种情况:函数接口传给你一个没有“\0”结尾的字符串str和他的长度str_len,调试的时候你需要将其打印出来。一般人都会这么做:[cpp] view plain copyvo转载 2017-03-11 16:52:26 · 14240 阅读 · 1 评论 -
【Linux】Ubuntu下C语言访问MySQL数据库入门
使用的系统是Ubuntu 11.10.数据库是MySQL。MySQL数据库环境配置首先需要安装mysql客户端和服务器,命令行安装方式为:[cpp] view plain copy print?sudo apt-get install mysql-server mysql-client 然后,转载 2017-08-23 09:53:27 · 2814 阅读 · 1 评论 -
C语言while(*s++=*t++)
while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个): while((*t) != 0){ *s = *t; s++; t++; }转载 2015-05-27 10:42:37 · 3016 阅读 · 1 评论 -
数组里a和&a的区别
#includeint main(void){ int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); //&a代表整个数组的地址,+1应该加上sizeof(a)的长度,所以ptr指向a[5]位置处。 printf("%d %d\n",*(a+1),*(ptr-1));//a代表数组首元素的地址,+1应该加上sizeof(a[0]),所以转载 2015-07-09 11:42:04 · 440 阅读 · 0 评论 -
const char*, char const*, char*const的区别
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 这个知识易混点之前是看过了,今天做Linux上写GTK程序时又出现个Warning,发散一下又想到这个问题,于是翻起来重嚼一下。事实上这个概念谁都有只是三种声明方式非常相似:Bjarne在他的The C++ Programming Language里面给出过一个助转载 2014-08-18 10:21:09 · 570 阅读 · 0 评论 -
指针数组和数组指针的区别
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。int* a[4]转载 2014-10-08 16:26:17 · 443 阅读 · 0 评论 -
c语言中连续使用两个scanf的问题
问题如下:先上程序一:#include int main (void){ int a, b; puts ("请输入一个整数"); scanf ("%d", &a); puts ("再输入一个整数"); scanf ("%d", &b); printf ("a = %d b = %d\n", a, b);return 0;} 二:#in转载 2015-03-16 13:47:42 · 16474 阅读 · 12 评论 -
c语言传值调用与引用调用
调用:把实参的值赋给形参1、传值调用 先把实参的值复制一份,把复制后的实参的副本赋给形参,之后形参如何变化与实参无关。2、引用调用 把实参(int a)的地址(&a)赋给形参(指针变量,比如*b,这时b=&a,即b指向变量a),如果*b(也即a对应的内存空间)发生变化,也就是变量a的值发生了变化。eg:main(){ int a=0; fun转载 2015-03-16 19:06:46 · 2831 阅读 · 0 评论 -
arm-linux-gcc/ld/objcopy/objdump参数总结
arm-linux-gccarm-linux-gcc -Wall -O2 -c -o $@ $ -o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件也就是.o的目标文件 -Wall 指定产生全部的警告信息 -O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高,O后面还可以附带其他的数值,表示提供不同的优化策略。转载 2015-04-10 20:42:02 · 650 阅读 · 0 评论 -
堆(heap)和栈(stack)有什么区别??
堆栈存放用户自己用malloc分配的空间,用free来释放;由用户自己管理,而栈存放函数的局部变量,由编译器来负责分配和回收管理,速度快,但容量有限,简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。预备知识—程序的内存分配一个由c/C转载 2015-04-09 19:40:37 · 2820 阅读 · 0 评论 -
C语言输出方式
%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,%u以十进制数输出unsigned型数据(无符号数)。%c用来输出一个字符,%s用来输出一个字符串,%f用来输出实数,以小数形式输出,%e以指数形式输出实数,%g根据大小自动选f格式或e格式,且不输出无意义的零。转载 2015-04-17 14:02:29 · 1033 阅读 · 0 评论 -
C语言中const分析(未知大小的全局变量数组声明出错)
一、const常量分析1、#include const bufsize = 100;char buf[bufsize];int main(){return 0;}编译:gcc -c test.c报错:test.c:3: error: variably modified 'buf’ at file scope 2、把buf定义到main函数中#in转载 2015-05-10 22:40:42 · 1194 阅读 · 0 评论 -
C语言中的main返回值
C语言几乎是所有人的第一个编程语言,而main函数则又是我们接触到的第一个函数。我们的所有程序都需要main函数,对于下面的代码,相信大家再熟悉不过了。 [cpp] view plaincopy#include void main() { printf("I am main function./n");转载 2015-05-16 14:08:48 · 714 阅读 · 0 评论 -
结构体大小的计算
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背【3】结构体的总大小为结构体最宽基本类型成员大小的整数背例如:struct{ int day; char month; int year;}a;sizeof(a)=12原创 2015-05-27 10:54:25 · 520 阅读 · 1 评论 -
C语言运算中的数据类型自动转换原则
1、隐式转换 C在以下四种情况下会进行隐式转换: 1、算术运算式中,低类型能够转换为高类型。 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。转载 2015-05-26 21:27:10 · 580 阅读 · 0 评论 -
指向指针数组的数组指针
#include #include int main(int argc, char *argv[]){ char *str[2];//指针数组 str[0] = "hello"; str[1] = "world"; printf("str[0]:%s\n" ,str[0]); printf("str[1]:%s\n" ,str[原创 2015-05-27 22:51:44 · 384 阅读 · 0 评论 -
三维数组的初始化
int[,,]=new int[2,3,4]{{{1,2,3,4}{1,2,3,4}{1,2,3,4}}{{5,6,7,8}{5,6,7,8}{5,6,7,8}}}注意初始化要先从最外围开始。原创 2015-03-17 15:26:01 · 9719 阅读 · 1 评论