1. 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回指向字符的指针的函数的指针的数组?
这个问题至少有以下3 种答案:
1. char *(*(*a[N])())();
2. 用typedef 逐步完成声明:
typedef char *pc; /* 字符指针*/
typedef pc fpc(); /* 返回字符指针的函数*/
typedef fpc *pfpc; /* 上面函数的指针*/
typedef pfpc fpfpc(); /* 返回函数指针的函数*/
typedef fpfpc *pfpfpc; /* 上面函数的指针*/
pfpfpc a[N]; /* 上面指针的数组*/
2. *p++ 自增p 还是p 所指向的变量?
后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。
拓展:
void func()
{
int i = 2;
int j = 5;
int *p = &i;
printf("result :%d\n",*(--p));
}
输出:
result :5
原因:栈是向低地址扩展的数据结构!
3.怎样判断机器的字节顺序是高字节在前还是低字节在前?
有个使用指针的方法:
int x = 1;
if(*(char *)&x == 1)
printf("little-endian\n");
else
printf("big-endian\n"); ......
PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。
扩展API的引入使PHP取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。
有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
首先,我们应该选择如何去构建我们的扩展模块, 有三种方式:
1. External Modules
外部模块,也就是编译成共享库,用dl()函数动态加载。
好处: (1)不需要重新编译 PHP (2)PHP体积小,因为不需要编译进PHP
缺点: (1)每次*.php� ......
PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。
扩展API的引入使PHP取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。
有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
首先,我们应该选择如何去构建我们的扩展模块, 有三种方式:
1. External Modules
外部模块,也就是编译成共享库,用dl()函数动态加载。
好处: (1)不需要重新编译 PHP (2)PHP体积小,因为不需要编译进PHP
缺点: (1)每次*.php� ......
oracle中pro*c的学习
一 Pro*C 程序概述:
1.什么是Pro*C程序
在ORACLE数据库管理和系统中, 有三种访问数据库的方法;
(1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;
(2) 用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*froms,QL*Reportwriter,SQL*Menu等;
(3) 利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。
Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。
在Pro*C程序中还可以嵌入PL/SQL块, 以改进应用程序的性能, 特别是在网络环境下,可以减少网络传输和处理的总开销。
2.Pro*C的程序结构图
通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性 ......
oracle中pro*c的学习
一 Pro*C 程序概述:
1.什么是Pro*C程序
在ORACLE数据库管理和系统中, 有三种访问数据库的方法;
(1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;
(2) 用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*froms,QL*Reportwriter,SQL*Menu等;
(3) 利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。
Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。
在Pro*C程序中还可以嵌入PL/SQL块, 以改进应用程序的性能, 特别是在网络环境下,可以减少网络传输和处理的总开销。
2.Pro*C的程序结构图
通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性 ......
今天是5月的最后一天了,2010年的5月,倒霉的一个月终于要过去了。今天抽空我又读完了第三章,顺便做下笔记。
这一章的题目叫做---语义“陷阱”
程序也有可能表面看上去是一个意思,实际上的意思却相去甚远。
对于数组:
C语言中只有一维数组,数组的大小必须在编译期就作为一个常数确定下来。多维数组是利用了C语言中数组元素的类型可以是任意的,当然也可以是一个数组。所以可以“仿真”出多维数组。对于一个数组,我们能够制定它的大小,并且获得指向该数组的下标为0的元素的指针。数组的下标操作其实就是对指针的操作。
将数组作为函数参数毫无意义,C语言会自动将作为参数的数组声明转换为相应的指针声明。
数组中实际不掺在“溢界”元素的地址位于数组所占内存之后,这个地址可以用于进行赋值和比较。但是引用时非法的。
指针:
int a[10]; a是一个拥有10个整型元素的数组,a是数组元素首地址。
int b[10][12];b是一个拥有10个整型数组元素(每个元素含有12个整型元素)的数组,b是指向数组的数组的指针。b[n],是数组b[n]中下标为0的元� ......
1) 函数声明
l C如果不写返回值,默认是int,而C++中不能不写返回值(可用void表示无返回值)。
如Func1();
l int Func1()在C中表示可带任意参数的函数,这是C的漏洞,使得它避开了参数类型检查;而C++中表示不带参数的函数。
2) 头文件的区别
l C++的头文件去掉了C中的.h,以c前缀开始。比如,<stdio.h> <stdlib.h>变为<cstdio> <cstdlib>
l C带.h的是非模板化的头文件,而C++是模板化的头文件。
.h文件是不含命名空间的,所以以前的<iostream.h>是不需要using的。
当然也可以用老的C头文件,但是,在同一个程序里不能混着用,虽然编译可以通过,但是可能会出现问题。
3) register变量
在C语言中,是不能对register变量取地址的,因为它没有虚地址,在寄存器里。而C++中,它是可以取址的,这时,C++编译器会忽略register,不会把它放到寄存器里。
4) const变量
C中,const是只读的变量, ......
1) 函数声明
l C如果不写返回值,默认是int,而C++中不能不写返回值(可用void表示无返回值)。
如Func1();
l int Func1()在C中表示可带任意参数的函数,这是C的漏洞,使得它避开了参数类型检查;而C++中表示不带参数的函数。
2) 头文件的区别
l C++的头文件去掉了C中的.h,以c前缀开始。比如,<stdio.h> <stdlib.h>变为<cstdio> <cstdlib>
l C带.h的是非模板化的头文件,而C++是模板化的头文件。
.h文件是不含命名空间的,所以以前的<iostream.h>是不需要using的。
当然也可以用老的C头文件,但是,在同一个程序里不能混着用,虽然编译可以通过,但是可能会出现问题。
3) register变量
在C语言中,是不能对register变量取地址的,因为它没有虚地址,在寄存器里。而C++中,它是可以取址的,这时,C++编译器会忽略register,不会把它放到寄存器里。
4) const变量
C中,const是只读的变量, ......
1) goto
goto 只能在一个函数内跳转。建议少用,使得程序维护起来容易出错;但是,在有多个循环情况下跳转,有时用goto可以使得问题变得简单。
class A
{
public:
A(){}
~A(){}
};
int main()
{
{
A a;
goto Label1;
}
Label1:
cout<<”end”<<endl;
return 0;
}
2) setjmp/longjmp
非局部域跳转(nonlocal goto),可用于在不同函数内跳转,步骤如下:
l include <setjmp.h>
l jmp_buf JumpBuffer
//跳转的位置结构
l setjmp(JumpBuffer)
保存当前的位置,将来 ......