Below you will find pages that utilize the taxonomy term “c语言”
December 29, 2011
二维数组和指针(C语言)
"int *p,a[5],b[3][4];\n指针变量给一维数组赋值,可以写成p=a;或则p=\u0026amp;a[0];\n二维数组需要写成 p=b[0]; 以下为指针与二维数组实例:\n#include \u0026lt;stdio.h\u0026gt; main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int (*p)[4]=a; printf(\u0026#34;%d\\n\u0026#34;,*(*(p+2) + 3)); } 输出结果为:\n23\n===========================\n应该注意指针数组和二维数组指针变量的区别。这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。 二维数组指针变量是单个的变量,其一般形式中”(*指针变量名)”两边的括号不可少。\n而指针数组类型表示的是多个指针(一组有序指针)在一般形式中”*指针数组名”两边不能有括号。\nint (*p)[3]; 表示一个指向二维数组的指针变量。该二维数组的列数为 3或分解为一维数组的长度为3。 int *p[3] 表示 p 是一个指针数组,有三个下标变量 p[0],p[1],p[2] …"
August 5, 2011
C语言中用const改善程序的健壮性
"关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,现将本人的一些体会总结如下,期望对大家有所帮助:\n一 const基础\n如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:\nint b = 500; const int* a = \u0026amp;b; [1] int const a = \u0026amp;b; [2] int const a = \u0026amp;b; [3] const int* const a = \u0026amp;b; [4]\n如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常 …"
August 5, 2011
const修饰指针和引用释疑(转载)
"const修饰指针和引用的用法,对于初学C++的人直是讳莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我为读者一一释疑: 大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用. 1.const修饰指针 const修饰指针又可分为三种情况:\nconst修饰指针本身 const修饰指针所指的变量(或对象) const修饰指针本身和指针所指的变量(或对象) (1).const修饰指针本身 这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如: const int a = 1; const int b = 2;\nint i = 3; int j = 4; int* const pi = \u0026amp;i; //ok, pi的类型为int* const , \u0026amp;i的类型为int* const int* const pi = \u0026amp;a; //error, pi的类型为int* const, \u0026amp;a的类型为const int* const pi = \u0026amp;j; //error, 指针是常量,不可变 *pi …"
August 5, 2011
C语言中 static 和 const
"static 的两大作用:\n一、控制存储方式:\nstatic被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。\n1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。\n2、 解决方案:因此c++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。\n二、控制可见性与连接类型 :\nstatic还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.\nstatic作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量( …"
August 5, 2011
程序基础C语言常量(const)参数
"函数 – 常量(const)参数 非指针参数(也就是传值参数)不会被修改原始值, const 对它是没有意义的。 const 只用于指针。\n*1. 第一种用法: const 类型 变量:\n这种用法将限制修改指针指向的值。#include\nint fun(const int *p) {\np += 1; / 只有去掉 const 这句才可以执行 */\nreturn *p;\n}int main(void)\n{\nint num = 3;\nprintf(“%dn”, fun(\u0026amp;num));\ngetchar();\nreturn 0;\n}\n不过也有办法绕过这个限制:\n#include\nint fun(const int *p) {\nint p2 = p; / 来个重名指针会绕过 const 的限制 */\n*p2 += 1;\nreturn *p;\n}int main(void)\n{\nint num = 3;"
July 1, 2011
关于C语言中的extern
"c语言有三种链接,外部链接,内部链接和无链接。\n外部链接:对构成程序的所有文件可用,如函数和全局变量具有外部链接。 内部链接:仅在声明他们的文件中是已知的。如声明为static的文件域具有内部链接。 无连接:仅在自己的块中已知,其它地方没有办法访问,如局部变量。\nextern主要作用是:声明在程序的其它地方使用外部链接声明的对象。 声明:表述对象的名称和类型。 定义:为对象分配存储空间。\n例如:\nint main(void) { extern int a, b; printf(“%d %d”, a, b); getch(); return 0; }\n/* 全局变量定义到了main之后 */\nint a = 10, b = 20; 程序输出10 20。\n通过extern声明变量a和b,可以在a和b定义之前使用,编译器不会提示错误。\nextern最重要的用途是多文件程序,c允许程序分散在多个文件中,分别编译,链接到一起。 我们在devc++中新建立一个c工程,然后在添新建一个单元保存名称为cunclx3.c\nmain.c的程序代码:\n#include #include int x,y; …"
June 16, 2011
c语言socket编程常用函数2
"socket()函数\n#include #include int socket(int domain, int type, int protocol); domain应该设置为”AF_INET”,和上面数据结构 struct sockaddr_in 中一样,或者其它的type 告诉内容是SOCK_STREAM还是SOCK_DGRAM 类型,或者其它的. protocol 设置为0.\nsocket()只是返回以后在系统调用中可能用到的socket描述符,或者错误的时候返回-1.全局变量errno中将存储返回的错误值.\n===================== bind() 函数 一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联起来。 ( 如果你想用 listen() 来侦听一定端口的数据,这是必要一步 –MUD 告 诉你说用命令 “telnet x.y.z 6969” 。 ) 如果你只想用 connect() ,那么这个步骤没有必 要 。 但是无论如何,请继续读下去。\n这里是系统调用 bind() 的大概:\n#include #include int bind(int …"
June 16, 2011
c语言socket编程笔记1
"struct sockaddr { unsigned short sa_family; // 地址家族,Af_XXX char sa_data[14]; // 14字节协议地址 };\nsa_family 能够是各种各样的类型,但是在这篇文章中都是”AF_INET” 。 sa_data 包含套接字中的目标地址和端口信息。 这好像有点不明智。\n=====================================\n为了处理 struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in (“in” 代表 “Internet”)\nstruct sockaddr_in { short int sin_family; //通讯类型(同struct sockadd中的sa_family一样可设置为 AF_INET ) struct in_addr sin_addr; //Internet 地址(结构体见下,网络字节顺序,储存 4 字节的 IP 地址) unsigned short int sin_port; //端口(网络字节顺序) unsigned …"
May 30, 2011
C语言对mysql数据库的操作
"这已经是一相当老的话题。不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的!\n我们言归正传\n1.头文件:\n#include\n#include\n#include “/usr/local/mysql/include/mysql/mysql.h” //这个是必需要包含的,下面对mysql的所有操作函数,都出自这里\n2.定义一个MYSQL变量:\nMYSQL mysql;\n这里MYSQL是一个用于连接MySql数据库的变量。\n在后面对mysql数据库的操作中,我们就用这个MYSQL变量作为句柄的。\n3.定义数据库参数:\nchar host[32]=”localhost”;\nchar user[32]=”username”;\nchar passwd[32]=”pwd”;\nchar dbname[32]=”testdb”;\n4.数据库操作\n1).初始化数据库:\nmysql_init(\u0026amp;mysql);\n2).连接数据库: …"
February 11, 2011
linux实现daemon程序
"国外相关文档:()\n编写Linux系统下Daemon程序的方法步骤\n一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。\n本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。\n二、Daemon程序简介\nDaemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。\n三、Daemon程序编写规则\n编写Daemon程序有一些基本的规则,以避免不必要的麻烦。\n1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。\n2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。\n3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。\n4、设置文件创建mask为0,避免创建文件时权限的影响。\n5、关闭不需要的打开文件 …"
February 11, 2011
用c语言实现的daemon实例
"守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。\n守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。\n一. 守护进程及其特性\n守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启 …"
October 31, 2010
C语言中指针变量和数组的组合
"int a[10];\nint * p;\nC语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:\np = \u0026amp;a[0];\np = a;\n摘自:C语言程序设计(第二版)p211\n(5)指针变量的值是可以改变的,见下例。\n例10.20 改变指针变量的值。\n#include \u0026lt;stdio.h\u0026gt; void main() { char *a = \u0026#34;I love China!\u0026#34;: a = a + 7; printf(\u0026#34;%s\u0026#34;, a); } 运行结果如下:\nChina!\n指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:\nchar str[] = {“I love China!”};\nstr = str + 7;\nprintf(“%s”, str);\n需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。\n例10.21 用带下标的字符指针变量引 …"
October 27, 2010
c语言中的scanf语法
"scanf函数,与 printf 函数一样,都被定义在 stdio.h 里,因此在使用scanf函数时要加上#include。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。\nscanf函数的一般形式 scanf(格式控制,地址表列)\nint scanf(char *format[,argument,…]);\n“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。\nscanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。\n例:使用scanf函数输入数据。\n在visual c++ 6.0上的编写方式。\n#include\nvoid main()\n{\nint a,b,c;\nprintf(“please input a,b,c”);\nscanf(“%d,%d,%d”,\u0026amp;a,\u0026amp;b,\u0026amp;c);\nprintf(“a=%d,b=%d,c=%d”,a,b,c);\n}\n在Dev-C++上运行程序为:\n#include\nint …"
October 25, 2010
指针 数字数组和字符数组首地址的输出
"#include #include\nint main() {\nchar *p;int *p1;\nint a[10]={1,2,3,4,5,6,7,8,9,0}; char str[]=”haohtmlcom”; p=str; p1=a;\nprintf( “%x” , p); /*输出的是地址*/ printf(“%s”,p); /*输出的是字符串haohtmlcom*/\nprintf(“%x”,p1); /*输出的是地址*/\nprintf(“%s”,p1); /*输出的是字符串,乱码*/\nsystem(“pause”);\n}\np,p1中存放的应为字符串,但在输出时还要兼顾前面的输出格式符的控制,如果是%s,则会将p的地址内的数据输出,而不再输出p本身的内容地址.\nprintf(“%c”, *p);//会输出字符串的第一个字母h\nprintf(“%d”, *p1);//会输出数组的第一个数字.\n所以 p,p1存放的都是地址,在用%c,%d时都能作为首地址输出第一个字母或数组元素,但是如果换用,%s,输出字符串,在一个地址空间内是不能存在字符串的,所以编译器会认为是连续空间内的字符串,所以 …"