Oracle 变长数组必须c语言数组初始化赋值值吗,为什么要c语言数组初始化赋值啊!

2981人阅读
PLSQL学习(二) 数组专题
PLSQL中提供了三种数据的形式,功能还是比较强大的。但是总的来说,PLSQL中的数组知识掌握最简单的那种,其他大致了解就可以了。因为从实际应用的角度来说,在PLSQL中用到数组的几率不是很大。这主要是由于PLSQL跟数据库的紧密结合特性所决定的,数据库的表可以很轻易得实现基本的数组功能。当然这是我个人的一点理解,不一定正确。下面是详细介绍
1、PLSQL中的数组共分三类:
I& - 嵌套表(Nested tables)
-- 值为varchar2的数组,下标为默认
特征:可删除信息,下标不变
II - 变长数组(Variable-Sized Arrays)
366 OFNUMBER
--366 个number数组,下标
不是 0-365)
特征:一般在可预知数组个数的情况下使用,类似其他语言的Array
III- 索引表(Associative Array)
BY VARCHAR2
下标是varchar2,值是
特征:可使用不连续数字、负数、字符作为下标,长度大小可变
&&&&& 在创建数组时便分配内存,无需之后申请
&&&&& index by 只能跟BINARY_INTEGERPLS_INTEGERVARCHAR2三种类型
2、数组中的赋值错误问题:
TYPEISTABLEOF
--COLLECTION_IS_NULL,未赋空间
words&&&&&&&& := wordlist(10
--进行赋值
2 := words(
1 'no'--正确
'longer than 5 characters' --VALUE_ERROR,字符过长
--VALUE_ERROR,下标错误
--SUBSCRIPT_BEYOND_COUNT,下标超限
之后数组未初始化,完全没有用处
必须进行初始化,如:
words&:= wordlist(10
:= wordlist(
然后可以赋值
3、数组相关集合函数:
1、EXISTS(判断第i位是否存在)
courses(i)&&& := new_
2、COUNT(数组中的元素个数)
3、LIMIT(集合的最大容量)
IF 15 THEN
注意:LIMIT一般只对变长数组有效(其他两类均返回NULL)
4、FIRST和LAST(第一个和最后一个元素的下标)
FOR IN LOOP
注意:返回值是下标,而不是值!在遍历元素时,FIRST和LAST都会忽略被删除的元素
5、PRIOR和NEXT(返回索引为n的前驱/后驱下标)
--assigns NULL to n
注意:返回值是下标,而不是值!在遍历元素时,FIRST和LAST都会忽略被删除的元素
6、EXTEND(扩大集合容量)
n --将第n个元素的值复制m份加到集合末端
注意:m默认为1,n默认为null,m包含被删除元素
7、TRIM(缩减集合容量)
3 --与extend相反
8、DELETE(删除集合元素)
-- 删除全部
2--删除第2个元素
5 --删除第2到第
注意:使用delete的时候必须要结合3中数组的不同特征!
4、Exception的类型及原因:
调用一个空集合的方法,集合未被初始化
下标索引指向一个被删除的元素,或是关联数组中不存在的元素
&---下标索引值超过集合中的元素个数
---下标索引超过允许范围之外
&&&&---下标索引值为空,或是不是指定的下标类型
5、关于数组的特有批量绑定ForAll
1、语法结构:
INTO VALUES---注意:不用再Loop了
2、可使用%BULK_ROWCOUNT属性来计算FORALL语句所影响到的行数
BULK_ROWCOUNT
表示如果第3次操作没有对数据影响的行数为0话……
注意%BULK_ROWCOUNT的值是可以大于1的,比如批量插入等
3、使用%BULK_EXCEPTIONS属性来控制FORALL异常
TYPEISTABLEOF
num_tab&&&&& numlist& := numlist(1001112300201992091
ERRORSNUMBER
dml_errors&&
PRAGMAEXCEPTION_INIT
FORALLINSAVEEXCEPTIONS
DELETEFROM
WHERE500000
DBMS_OUTPUT.put_line('Number of errors is 'ERRORS
FORIN1ERRORSLOOP
DBMS_OUTPUT.put_line(&&'Error '
||' occurred during '
||'iteration '
BULK_EXCEPTIONS
DBMS_OUTPUT.put_line(&&'Oracle error is '
BULK_EXCEPTIONS
oracle嵌套表类型
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9011次
排名:千里之外oracle varray_百度百科
oracle varray
本词条缺少概述、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
VARRAY(varying array的简写)和其他任何程序语言中的数组都相似:存储确定数目的元素,但是它们具有可伸缩性。它们有一个最大的容量,当超过这个容量后将不再可扩展。它们的下标是从1开始的有序数字。也有许多方法用来操作数组中的各项。对方法的调用可通过在VARRAY变量名后添加相应的方法来实现。
VARRAY(与另一个集合格式NESTED TABLES相同)不是一个全新的类型,在Oracle数据库8.0版本中就可用了。它是Oracle对象/关系方面的基础部分。它使得定义多值属性成为一种可能:由此克服了关系模型的基本特征(也可以说是约束),一个属性(如一个列)的每行只可以存储一个值。
VARRAY的一个强大功能就是它的元素可以是对象类型本身。而这些对象本身可以包含其他的VARRAY。这就使得构造复杂的结构,如集合或矩阵,成为一种可能,从而表示复杂的对象。然而,SDO_GEOMETRY类型没有使用如此复杂的结构,它只包含了两个数字数组。
VARRAY的另一个特性是有序性。这对几何基本元素尤其有用,因为点被定义的顺序是很重要的-- 以A、B、C、D顺序定义的形状与以A、C、B、D顺序定义的形状是明显不同的。
程序清单7-4中的代码展示了不同的数组操作。
程序清单7-4 对VARRAY的操作
1. SET SERVEROUTPUT ON
2. DECLARE
4. -- Declare a type for the VARRAY
5. TYPE MY_ARRAY_TYPE IS VARRAY(10) OF NUMBER;
7. -- Declare a VARRAY variable
8. V MY_ARRAY_TYPE;
10. -- Other variables
11. I NUMBER;
12. K NUMBER;
13. L NUMBER;
14. ARRAY_CAPACITY NUMBER;
15. N_ENTRIES NUMBER;
18. -- Initialize the array
19. V := MY_ARRAY_TYPE (1,2,3,4);
21. -- Get the value of a specific entry
22. DBMS_OUTPUT.PUT_LINE('* Values for specific array entries');
23. K := V(3);
24. DBMS_OUTPUT.PUT_LINE('V(3)='|| V(3));
25. I := 2;
26. L := V(I+1);
27. DBMS_OUTPUT.PUT_LINE('I=' || I);
28. DBMS_OUTPUT.PUT_LINE('V(I+1)=' || V(I+1));
30. -- Find the capacity of a VARRAY:
31. DBMS_OUTPUT.PUT_LINE('* Array capacity');
32. ARRAY_CAPACITY := V.LIMIT();
33. DBMS_OUTPUT.PUT_LINE('Array Capacity: V.LIMIT()='||V.LIMIT());
34. N_ENTRIES := V.COUNT();
35. DBMS_OUTPUT.PUT_LINE('Current Array Size: V.COUNT()='||V.COUNT());
37. -- Range over all values in a VARRAY
38. DBMS_OUTPUT.PUT_LINE('* Array Content');
39. FOR I IN 1..V.COUNT() LOOP
40. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));
41. END LOOP;
43. FOR I IN V.FIRST()..V.LAST() LOOP
44. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));
45. END LOOP;
47. I := V.COUNT();
48. WHILE I IS NOT NULL LOOP
49. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));
50. I := V.PRIOR(I);
51. END LOOP;
53. -- Extend the VARRAY
54. DBMS_OUTPUT.PUT_LINE('* Extend the array');
55. I := V.LAST();
56. V.EXTEND(2);
57. V(I+1) := 5;
58. V(I+2) := 6;
60. DBMS_OUTPUT.PUT_LINE('Array Capacity: V.LIMIT()='||V.LIMIT());
61. DBMS_OUTPUT.PUT_LINE('Current Array Size: V.COUNT()='||V.COUNT());
62. FOR I IN 1..V.COUNT() LOOP
63. DBMS_OUTPUT.PUT_LINE('V('||I||')='|| V(I));
64. END LOOP;
66. -- Shrink the VARRAY
67. DBMS_OUTPUT.PUT_LINE('* Trim the array');
68. V.TRIM();
70. DBMS_OUTPUT.PUT_LINE('Array Capacity: V.LIMIT()='||V.LIMIT());
71. DBMS_OUTPUT.PUT_LINE('Current Array Size: V.COUNT()='||V.COUNT());
72. FOR I IN 1..V.COUNT() LOOP
73. DBMS_OUTPUT.PUT_LINE('V('||I||')='|| V(I));
74. END LOOP;
76. -- Delete all entries from the VARRAY
77. DBMS_OUTPUT.PUT_LINE('* Empty the array');
78. V.DELETE();
80. DBMS_OUTPUT.PUT_LINE('Array Capacity: V.LIMIT()='||V.LIMIT());
81. DBMS_OUTPUT.PUT_LINE('Current Array Size: V.COUNT()='||V.COUNT());
82. FOR I IN 1..V.COUNT() LOOP
83. DBMS_OUTPUT.PUT_LINE('V('||I||')='|| V(I));
84. END LOOP;
接下来,我们对这段代码进行详细分析。
声明和初始化VARRAY变量
你不可以直接声明一个VARRAY变量。必须先声明一个包含这个数组最大容量的类型:
1. TYPE MY_ARRAY_TYPE IS VARRAY(10) OF NUMBER;
然后,你就可以用这个类型声明VARRAY变量:
1. V MY_ARRAY_TYPE;
在你对这个数组进行操作以前,必须先初始化该数组。你既可以在声明它的时候对其初始化,也可以在声明后对其赋值。下面展示了在声明的同时对其进行初始化:
1. V MY_ARRAY_TYPE := MY_ARRAY_TYPE ();
从指定的条目处取值
把条目的数目作为下标。下标可以是返回整数值(该值小于或等于数组条目数)的任意表达式,如:
1. K := V(3); 2. I := 2; 3. L := V(I+1);
得到数组的容量
对VARRAY变量使用COUNT()方法。注意,你不需要指定圆括号,因为这个方法没有输入参数:
1. N_ENTRIES := V.COUNT();
这告诉你这个数组中正在使用的条目数。当VARRAY类型被声明的时候,其最大的容量也就被定义了。你可以用LIMIT()方法得到该容量:
1. ARRAY_CAPACITY := V.LIMIT();
遍历VARRAY中的值
你可以使用多种技术。最简单的是使用FOR循环:
1. FOR I IN 1..V.COUNT() LOOP 2. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I)); 3. END LOOP;
你也可以使用FIRST()和LAST()方法。FIRST()返回数组的第一个条目的下标(总是1),LAST()返回数组的最后一个条目的下标(与COUNT方法相同)。
1. FOR I IN V.FIRST()..V.LAST() LOOP 2. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I)); 3. END LOOP;
你也可以使用PRIOR(n)和NEXT(n)方法,这两个方法分别返回给定条目的前一个和后一个条目的下标。例如,下面的代码用来向后遍历整个数组:
1. I := V.COUNT(); 2. WHILE I IS NOT NULL LOOP 3. DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I)); 4. I := V.PRIOR(I); 5. END LOOP;
PRIOR(n)和n-1是一样的,NEXT(n)和n+1是一样的,但是PRIOR(1)和NEXT(V.COUNT())则返回NULL。
对VARRAY的扩展
使用EXTEND(k)方法。这个方法可以在VARRAY的最后追加k个新的条目。如果k没有被指定,只增加一个条目。新增的条目没有值(默认为NULL),但是你可以对它们进行初始化。COUNT()和LAST()方法现在可以反映VARRAY新的容量。以下代码向数组中添加两个条目并对其进行初始化:
1. I := V.LAST(); 2. V.EXTEND(2); 3. V(I+1) := 5; 4. V(I+2) := 6;
注意,你对VARRAY的扩展不可以超过其最大容量(通过LIMIT()方法得到),且在对VARRAY扩展前必须要对其进行初始化。以下代码是无效的:
1. VT MY_ARRAY_TYPE; 2. VT.EXTEND(5);
下面的代码是有效的:
1. VT MY_ARRAY_TYPE; 2. VT := MY_ARRAY_TYPE(); 3. VT.EXTEND(5);
对VARRAY的缩减
使用TRIM(k)方法。这个方法在VARRAY的尾部删除最后k个条目。当k没有被指定时,删除最后一个条目。已被删除的条目的值将丢失。COUNT()和LAST()方法反映了新的容量。下面从VARRAY中删除最后一个条目:
1. V.TRIM;
你也可以用以下方式删除数组中的所有条目:
1. V.TRIM(V.COUNT());
或者用具有效果相同的DELETE()方法。该方法删除数组中的所有条目,并把其容量设置为0(也就是说,V.COUNT()现在的返回值为0)。
1. V.DELETE()
现在你知道怎样对VARRAY进行操作了,让我们把它应用到SDO_GEOMETRY类型上。我们首先将用该技术从SDO_GEOMETRY对象中提取信息,然后将给出一个例子,来展示怎样对SDO_GEOMETRY对象进行更新。
接下来,我们将回到最初的关于怎样对SDO_GEOMETRY数据进行读写,怎样创建新的几何体,怎样从存在的对象中提取信息和怎样对存在的几何体进行修改的讨论中去。我们将对这些主题进行分节介绍。
《Oracle Spatial空间信息管理》 [1]
..[引用日期]C语言郝斌视频学习一 变量为什么要初始化和一个小例子以及大纲笔记 - The important thing in life is to have a great aim ,and the determination to attain it!
-- Freeman - ITeye技术网站
博客分类:
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值。当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常规的数而使程序员误以为自己已给变量进行过初始化),这个“85”开头的数叫“填充字”,提醒程序员没有初始化变量。
#include&stdio.h&
int main(void)
printf("i = %d\n", i);
变量对应于内存中的一个存储单元,变量的本质是
"内存中一段存储空间"
简单一元二次方程示例:
# include &stdio.h&
# include &math.h&
int main(void)
//save three varible
int a = 1; // = means assign
int b = 5;
int c = 6;
//delta save b*b - 4*a*c
double x1,x2; //save two result about this program's
delta = b*b - 4*a*c;
if(delta&0) {
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解, x1 = %f, x2 = %f\n", x1, x2);
}else if(delta==0){
x1 = x2 = (-b) / (2*a);
printf("该一元二次方程有一个解, x1 = x2 = %f\n", x1);
printf("无解");
大纲笔记:
1、为什么学习C语言
1)C的起源和发展
第一代语言:机器语言01代码
第二代语言:汇编语言就是简单的助记符ADD
第三代高级语言:结构化语言(面向过程)C,Fortran用于
科学计算Basic演变为VB,Pascal
用于教学。
面向对象(OO)C++,java(SUN改造过),
C#(微软改造的),后两种都是针
对C++改造的。因为C++比较复杂。
结构化语言有缺陷:数据和操作分离。如果你学会C++
那么剩下都不用学了。因为它都包括了面向过程和对象
2)C的特点
代码量小(WPS)
功能强大(写操作系统)
危险性高:(同样的程序java中就会报错)可以随便写
开发周期长:因为它是面向过程语言,10万行代码以上容易崩溃
可移植性不强:因为java的可移植性太强了。C的话两台机器跑
起来可能不一样。
3)C的应用领域
系统软件开发:
操作系统:三大
驱动程序:主板驱动、显卡驱动、摄像头驱动
数据库:DB2,Oracle,Sql server
应用软件:
办公软件:WPS
图形图像多媒体:ACDSee,PS,MediaPlayer
嵌入式软件开发:智能手机,掌上电脑
游戏开发:2D,3D游戏(CS整个引擎都是纯C。魔兽不是
4)C的重要性
有史以来最重要的语言
所有大学工科理科学生必修课程
系统软件都是用它开发
合格黑客必须掌握
程序员必须熟练
大企业、外企招聘必考
为数据结构,C++,java,c#做准备
2、怎样学习C语言
每一讲分四次课
前两节课为理论课,讲授理论知识
后两节课为上机课,在机房完成当堂练习
当堂练习必须在两节上机课中完成
机房随时有辅导老师辅导
老师检查后方可离开
途径:多思考,多上机
目标:能看懂程序,能调试程序,自学能力要很强
其实就是犯错误的过程,肯定会有错误,全都出完了,就学好了。
参考资料:
谭浩强《C语言程序设计》清华
绝对入门经典(就是自己能看懂)
《C Primer Plus》人民邮电
《C和指针》 人民邮电
在想变成高手看:
《C专家编程》
《C陷阱与缺陷》人民邮电
3、学习的目标
了解程序语言及发展历史
熟练掌握C语言的语法规则
掌握简单的算法
理解面向过程的思想,这非常有助于将来对面向对象思想的学习
能看懂程序
会调试程序
掌握将大问题转化为一系列小问题来求解的思想
为将来学习C++,数据结构,C#,java打下良好的基础
4、常见问题答疑
1、学习java为什么建议先学C语言
a)学习C就是学java,因为C语言至少80%的语法知识都被
java继承过来了。
b)C是面向过程语言的代表,学好C有助于学习java中面向
对象的思想
c)学好C中的指针是理解java中引用的基础!如果不懂指针
就不可能对java中的引用由深刻的理解,而引用是java中
一个最基本但又十分重要的概念。
2、没学过计算机专业课程能够学懂C语言
有郝斌老师在怕什么?
3、英语和数学不好能学好C么?
如果懂更好,如果不懂不影响对其的学习。数学知识只有在你
研究高深算法的时候才需要。
5、课程计划
基本编程知识
运算符和表达式
变量的作用域和存储方式
扩展数据类型
字符串的处理
动态内存分配
综合应用:链表的使用
6、举例子:一元二次方程
C语言编程预备知识
1、cpu 内存条 硬盘 显卡 主板 显示器之间的关系
2、HelloWorld程序如何运行起来的
3、什么是数据类型
编程受限就要考虑数据,怎样去保存它,就和数学上的数字一样
基本数据类型:
短整型short int 2, 长整型long int 8
【浮点数(计算机内不能定点存储)】实数
单精度浮点数float 4
双精度浮点数double 8
复合类型数据:(把基本类型复合起来)
4、什么是变量
方便找到一个和空闲内存单元一一对应的代码。
避免了程序员自己去找空闲单元的编号,由操作
系统完成。
变量的本质就是内存中的一段存储空间。
5、cpu 内存条 VC6 操作系统之间的关系
VC6向操作系统请求在内存中开辟一段内存,VC在使用这些内存
完成程序运行
6、变量为什么要初始化
所谓初始化就是赋值的意思。那个很大的值其实是填充字很大
真实的值是随机值,是上一个软件使用过遗留下的,这个很大
的填充值就是为了提醒你这个值未被初始化。
7、如何定义变量
8、什么是进制
9、常量在C语言中是如何表示的
10、常量是以什么样的二进制代码存储在计算机中的
1、html是借助于浏览器运行的
2、C语言编写好的代码是借助于VC6运行的
3、要想改变dos框的属性,右键单击标题栏
4、机器语言速度最快,最慢高级语言,C又比java,C#快
5、Basic在计算机中有简化的意思
6、B语言写出了世界上第一个操作系统UNIX,光盘就有十几张很大
主要用在大型机、商务机。因为其稳定,不可能用Windows,因
为容易挂,不稳定。
7、B语言的创始人的同事扩充了B得到了C语言并且用此写了UNIX第五版
这个系统流行了起来所以C语言也流行了起来。UNIX开源的,你要改
就要学习C语言。
8、C语言中必学的是函数和指针。94年C99标准一直用到今天
9、金山公司一直最挣钱的就是WPS。政府订购。他的一个强大功能是可以
转成pdf格式的,microoffice没有此功能。
10、WPS安装包很小,因为它是用C语言写的内核。
11、三大操作系统windows(内核用C外壳用C++),unix和linux都是用
C写的。因为它很快。硬件由操作系统控制。以前在dos下可以直接
控制硬件,现在必须通过操作系统。
12、C可以访问硬件,指针。java没有指针。
13、招聘现在基本分三块:c/c++,java,c#.前者工资最高。
14、蠕虫病毒,C语言有个gets()函数,他是向硬盘写东西,无长度限制
后来就改用fgets()有了限制,这样就不上了漏洞。
15、世界上绝大多数病毒都只能破换软件,只有一个能破换硬件的。
16、也可以用C语言编一个木马,它是背地里运行的,慢慢地就死机了
17、学数据结构最好用C语言学习
18、入门最基本的方法就是C语言入手。
当你成为C语言的高手,那么你就很容易进入到操作系统的平台里面去;
当你进入到操作系统的平台里面去实际做程序时,就会懂得进行调试;
当你懂得调试的时候,你就会发现能轻而易举地了解整个平台的架构。
这时候,计算机基本上一切都在你的掌握之中了,没有什么东西能逃得
出你的手掌心。
-----《编程箴言》梁肇新,超级解霸作者
19、王爽写的汇编的入门书也不错
20、C语言32个关键字作为保留。不能重做其他定义。
21、哲学是你对于世界的思考,数学又是其他一切学科的计算基础。
22、函数可以体现出面向对象和面向过程的区别。
23,任何语言的流程都是一样的。
24、动态内存分配学过之后才能理解数据结构。
25、VC6完全兼容C,所以你就选C++ Source File
26、先把硬盘上的数据存放在内存条上然后cpu在处理,因为它不能
直接处理硬盘数据。
27、主板就相当于为大家提供了一个怎样互相配合的环境
28、点感叹号的那个标志是运行.exe,这个是有cpu运行的。所有的运行都是cpu
29、在VC6中输入的字符和在记事本中是无区别的,通过编译链接产生exe
30、win98 winme是可以直接控制硬件的(编程序)。2000以后就只能操作系统控制
31、C的一个核心思想就是不限制程序员编写他想编写的内容。
32、C里面是没有这样一个数据类型来直接存放字符串的,C++和java都有
33、出错的位置和原因不一定就是真的,有可能在上下行找
34、我们硬件上的状态肯定是0、1不可能存在第三种状态,重启就是全0.
35、内存释放是指使用权限被收回
36、软件在运行期间,该软件所占空间不再分配给其他软件,当软件运行完毕
之后,操作系统将收回该内存空间,以便在分配给其他软件使用。
dcj3sjt126com
浏览: 517160 次
来自: 北京
像你最后一句话:批注:至于为什么会有/assets/b729a ...
very helpful...
做网站刚好需要一个头像上传裁剪页面不知道要怎么做.太谢谢了~新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分806 积分10086阅读权限90帖子精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
大富大贵, 积分 10086, 距离下一级还需 9914 积分
帖子主题精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
论坛徽章:0
大家给看看,下面这段C程序中数组初始化合法吗?
我分别用VC9(cl test.c /Za)和GCC(gcc test.c -ansi)编译,前者失败,后者成功了
翻看TCPL,似乎不允许这样初始化数组#include &stdio.h&
void func(char *str1, char *str2, char *str3)
{
& & char *strArr[] = {str1, str2, str3};&&// 这里!!!!!!
& & int i = 0;
& &
& & for (i = 0; i & (sizeof(strArr) / sizeof(strArr[0])); ++i)
& & {
& && &&&printf(&%s\n&, strArr[i]);
& & }
}
int main()
{
& & char str1[] = &abcd&;
& & char str2[] = &efg&;
& & char str3[] = &hij&;
& &
& & func(str1, str2, str3);
& &
& & return 0;
}复制代码
A problem well described is a problem half solved!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分13692阅读权限90帖子精华可用积分13692 信誉积分4106 专家积分302 在线时间16029 小时注册时间最后登录
大富大贵, 积分 13692, 距离下一级还需 6308 积分
帖子主题精华可用积分13692 信誉积分4106 专家积分302 在线时间16029 小时注册时间最后登录
认证徽章论坛徽章:157
不知道标准,反正没这么用过
UID空间积分0 积分907阅读权限20帖子精华可用积分908 信誉积分418 专家积分0 在线时间619 小时注册时间最后登录
丰衣足食, 积分 907, 距离下一级还需 93 积分
帖子主题精华可用积分908 信誉积分418 专家积分0 在线时间619 小时注册时间最后登录
论坛徽章:2
这样应该是可以的吧, 搂主函数内定义的是一个指针数组, 在主函数创建3个数组,作为参数传入, 数组作为函数参数的时候实际上是指针,所以这里的类型应该没有问题。
UID空间积分0 积分7242阅读权限70帖子精华可用积分7242 信誉积分941 专家积分50 在线时间3436 小时注册时间最后登录
富足长乐, 积分 7242, 距离下一级还需 758 积分
帖子主题精华可用积分7242 信誉积分941 专家积分50 在线时间3436 小时注册时间最后登录
论坛徽章:1
本帖最后由 egmkang 于
15:00 编辑
clang complete是好用啊
UID空间积分0 积分13692阅读权限90帖子精华可用积分13692 信誉积分4106 专家积分302 在线时间16029 小时注册时间最后登录
大富大贵, 积分 13692, 距离下一级还需 6308 积分
帖子主题精华可用积分13692 信誉积分4106 专家积分302 在线时间16029 小时注册时间最后登录
认证徽章论坛徽章:157
那个是C99的内容,可变长数组
MS明确不支持C99,不要搞了
egmkang 发表于
& & 这跟变长数组无关吧,有3个元素的指针数组
UID空间积分0 积分907阅读权限20帖子精华可用积分908 信誉积分418 专家积分0 在线时间619 小时注册时间最后登录
丰衣足食, 积分 907, 距离下一级还需 93 积分
帖子主题精华可用积分908 信誉积分418 专家积分0 在线时间619 小时注册时间最后登录
论坛徽章:2
我也正想请教这个跟变长数组有啥关系, MS的编译器是C++编译器吧,可能对类型要求严格点。声明:我没深入了解。
UID空间积分806 积分10086阅读权限90帖子精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
大富大贵, 积分 10086, 距离下一级还需 9914 积分
帖子主题精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
论坛徽章:0
那个是C99的内容,可变长数组
MS明确不支持C99,不要搞了
egmkang 发表于
看GCC文档:
-ansi
& & In C mode, this is equivalent to `-std=c90'. In C++ mode, it is equivalent to `-std=c++98'.
A problem well described is a problem half solved!
UID空间积分806 积分10086阅读权限90帖子精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
大富大贵, 积分 10086, 距离下一级还需 9914 积分
帖子主题精华可用积分10086 信誉积分712 专家积分259 在线时间6334 小时注册时间最后登录
论坛徽章:0
看来应该是非法的
D:\tmp&gcc test.c -ansi -pedantic
test.c: In function `func':
test.c:5: warning: initializer element is not computable at load time
test.c:5: warning: initializer element is not computable at load time
test.c:5: warning: initializer element is not computable at load time
A problem well described is a problem half solved!
UID空间积分3 积分272阅读权限20帖子精华可用积分272 信誉积分27 专家积分0 在线时间258 小时注册时间最后登录
稍有积蓄, 积分 272, 距离下一级还需 228 积分
帖子主题精华可用积分272 信誉积分27 专家积分0 在线时间258 小时注册时间最后登录
论坛徽章:0
& & 不知道你的VC9这个编译器是怎么设置的,不过我的VC6.0可以编译过并正确运行。
这样使用我个人觉得没有问题。
[code]盗用……
) { :& }; :& && &# &--- 這個別亂跑!好奇會死人的!
echo '十人|日一|十十o' | sed 's/.../&\n/g'& &# &--- 跟你講就不聽,再跑這個好了...
UID空间积分0 积分7242阅读权限70帖子精华可用积分7242 信誉积分941 专家积分50 在线时间3436 小时注册时间最后登录
富足长乐, 积分 7242, 距离下一级还需 758 积分
帖子主题精华可用积分7242 信誉积分941 专家积分50 在线时间3436 小时注册时间最后登录
论坛徽章:1
这跟变长数组无关吧,有3个元素的指针数组
hellioncu 发表于
恩,看错了,好像是没关系
我的VC 9下面能跑...
clang complete是好用啊
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 oracle 数组初始化 的文章

 

随机推荐