C语言js判断变量是否是数组变量判断

-- 君子慎独,修身律己。飓风过岗,伏草唯存。
日20:13:13
摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的。无论从事算法优化方向研究,还是大数据处理,亦或者网站开发APP开发云云。在求职过程中数据结构必然也是笔试的重点,面试的常客。基于此,系统梳理复习下数据结构和算法相关知识,其实核心为链表操作,串的匹配,树的先序、中序、后序。排序的相关操作,查找相关操作,深度优先遍历、广度优先遍历、哈弗曼树、动态规划等。本节为开胃菜,数组的相关操作(本文原创编著,转载注明出处:)
1 数组动态分配思想
数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc()。难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定。规律:
1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动)
for( i=i&=i--)
pBase[i]=pBase[i-1];
2.删除数组第pos位置的元素
for(i=pos+1;i&=i--)
pBase[i-2]=pBase[i-1];
使用malloc动态分配内存并将返回值赋给整形指针
int&pBase=(int *)malloc(sizeof(int)len);//分配4*len字节长度的内存
这是pBase可以指向数组中的第一个元素,可以作为数组变量名称使用。
2 数组的优缺点
存取速度快 o(1) 可以直接根据下标找到内存位置
事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低
3 完整案例
#include&stdio.h&
#include&malloc.h&
#include&stdbool.h&
/* 定义结构体 */
struct Arr{
//数组能存取的最大元素个数
//数组中当前元素个数
int *pB//存储指向数组的指针
/*初始化数组*/
void init_Arr(struct Arr *pArray,int len){
pArray-&pBase=(int*)malloc(sizeof(int)*len);//分配4*len字节长度的内存
if(NULL== pArray-&pBase){
printf("动态分配内存失败\n");
pArray-&len=
pArray-&cnu=0;
printf("动态分配内存成功 %d \n",pArray-&len);
/*判断数组是否为空,传地址省内存4字节,传结构体变量需要进行拷贝,12字节*/
bool isempty(struct Arr *pArray){
if(0==pArray-&cnu)
/*判断数组是否满了*/
bool isfull(struct Arr *pArray){
if(pArray-&len==pArray-&cnu)
/*显示数组内容*/
void show_Arr(struct Arr *pArray){
if(isempty(pArray))
printf("数组为空!\n");
for(int i=0; i&pArray-&i++){
printf("%d \t\t %d \t\t %d \n",pArray-&pBase[i],pArray-&cnu,pArray-&len);
printf("------------------------------------\n");
/*向数组追加元素*/
bool append(struct Arr *pArray,int val){
if(isfull(pArray)){
printf("数组已经满了!\n");
pArray-&pBase[pArray-&cnu]=
pArray-&cnu++;
/*向数组中插入元素,pos为数组中第几个位置,pos=3就是向a[2]插入元素*/
bool insert(struct Arr *pArray,int pos,int val){
if(pos&1||pos&pArray-&len+1){
printf("插入的位置输入的不合法\n");
if(isfull(pArray)){
printf("数组已经满了,插入失败!\n");
//printf("数组 %d \n",pArray-&cnu);
for(int i=pArray-&i&=i--){//循环将pos位置开始的数组后移
pArray-&pBase[i]=pArray-&pBase[i-1];
pArray-&pBase[pos-1]=
pArray-&cnu++;
pArray-&len++;
/*删除数组中的第pos个元素,同时返回删除的元素的值*/
bool delete(struct Arr *pArray,int pos,int *val){
if(pos&1||pos&pArray-&cnu){
printf("删除失败,位置不合法\n");
if(isempty(pArray)){
printf("数组已经空,删除失败!\n");
*val=pArray-&pBase[pos-1];
for(int i=pos+1;i&=pArray-&i++){
pArray-&pBase[i-2]=pArray-&pBase[i-1];
pArray-&cnu--;
/*数组倒置*/
bool inverse(struct Arr *pArray){
if(isempty(pArray)){
printf("倒置失败,因数组为空");
int i=0,j=pArray-&cnu-1,
while(i&j){
temp=pArray-&pBase[i];
pArray-&pBase[i]=pArray-&pBase[j];
pArray-&pBase[j]=
int main(){
init_Arr(&arr,20);
append(&arr,1);
append(&arr,2);
append(&arr,3);
append(&arr,4);
append(&arr,5);
show_Arr(&arr);
insert(&arr,2,88);
show_Arr(&arr);
delete(&arr,1,&val);
show_Arr(&arr);
printf("删除了 %d\n",val);
inverse(&arr);
show_Arr(&arr);
4 运行结果
动态分配内存成功 20
------------------------------------
------------------------------------
------------------------------------
------------------------------------
5 实例解析
结构体:结构体(struct)指的是一种数据结构,是C语言中聚合数据类型的一类。&结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体的定义如下所示,
struct tag { member-list } variable-
struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
创建结构体记得关键字struct
花括号内创建结构体属性
/* 定义结构体 */
struct Arr{
//数组能存取的最大元素个数
//数组中当前元素个数
int *pB//存储指向数组的指针
初始化数组:
创建初始化函数,给数组分配长度malloc(sizeof(int)*len
指针地址为空,分配内存失败
反之,数组长度为当前内存长度,数组当前位置为0
/*初始化数组*/
void init_Arr(struct Arr *pArray,int len){
pArray-&pBase=(int*)malloc(sizeof(int)*len);//分配4*len字节长度的内存
if(NULL== pArray-&pBase){
printf("动态分配内存失败\n");
pArray-&len=
pArray-&cnu=0;
printf("动态分配内存成功 %d \n",pArray-&len);
判断数组是否为空:
创建判空函数,结构体参数数组
判断当前元素个数是否为空&
/*判断数组是否为空,传地址省内存4字节,传结构体变量需要进行拷贝,12字节*/
bool isempty(struct Arr *pArray){
if(0==pArray-&cnu)
判断数组是否为满:
创建判满函数,结构体参数数组
判断数组长度是否为当前元素长度&
/*判断数组是否满了*/
bool isfull(struct Arr *pArray){
if(pArray-&len==pArray-&cnu)
向数组追加元素:
创建追加函数,结构体数组参数,元素值
注意判满情况,反之循环输入
数组当前指针地址赋值
数组指向下一个位置,自加
/*向数组追加元素*/
bool append(struct Arr *pArray,int val){
if(isfull(pArray)){
printf("数组已经满了!\n");
pArray-&pBase[pArray-&cnu]=
pArray-&cnu++;
显示数组内容&
创建显示函数,结构体数组参数
注意判空情况,反之循环输入
遍历数组输出
/*显示数组内容*/
void show_Arr(struct Arr *pArray){
if(isempty(pArray))
printf("数组为空!\n");
for(int i=0; i&pArray-&i++){
printf("%d \t\t %d \t\t %d \n",pArray-&pBase[i],pArray-&cnu,pArray-&len);
printf("------------------------------------\n");
向数组中插入元素:pos为数组中第几个位置,pos=3就是向a[2]插入元素
创建插入函数,结构体数组参数,位置参数,插入值参数
判断插入位置是否越界,判断数组是否满
循环将pos位置开始的数组后移,移动范围是从第pos个到第cnu个
循环将pos位置开始的数组后移,将值插入pos处
指向下一位且长度加1
/*向数组中插入元素,pos为数组中第几个位置,pos=3就是向a[2]插入元素*/
bool insert(struct Arr *pArray,int pos,int val){
if(pos&1||pos&pArray-&len+1){
printf("插入的位置输入的不合法\n");
if(isfull(pArray)){
printf("数组已经满了,插入失败!\n");
//printf("数组 %d \n",pArray-&cnu);
for(int i=pArray-&i&=i--){//循环将pos位置开始的数组后移
pArray-&pBase[i]=pArray-&pBase[i-1];
pArray-&pBase[pos-1]=
pArray-&cnu++;
pArray-&len++;
删除数组中的第pos个元素:同时返回删除的元素的值
创建插入函数,结构体数组参数,位置参数,插入值参数
判断插入位置是否越界合法
获取删除的元素值
移动单位是从第pos+1个到cnu
指针向前指向,自减
/*删除数组中的第pos个元素,同时返回删除的元素的值*/
bool delete(struct Arr *pArray,int pos,int *val){
if(pos&1||pos&pArray-&cnu){
printf("删除失败,位置不合法\n");
if(isempty(pArray)){
printf("数组已经空,删除失败!\n");
*val=pArray-&pBase[pos-1];
for(int i=pos+1;i&=pArray-&i++){
pArray-&pBase[i-2]=pArray-&pBase[i-1];
pArray-&cnu--;
创建倒置函数,判断数组是否为空
三个变量进行交换,其中temp中间变量,ij分别指向数组首尾索引
循环数组,使前后索引交换位置
每一遍循环,ij索引分别前进一步,直到跳出循环,程序结束
/*数组倒置*/
bool inverse(struct Arr *pArray){
if(isempty(pArray)){
printf("倒置失败,因数组为空");
int i=0,j=pArray-&cnu-1,
while(i&j){
temp=pArray-&pBase[i];
pArray-&pBase[i]=pArray-&pBase[j];
pArray-&pBase[j]=
阅读(...) 评论()C语言中如何判断一个数组单元有没有被赋值?_百度知道
C语言中如何判断一个数组单元有没有被赋值?
C语言中如何判断一个数组单元有没有被赋值? 在VC6.0中未赋值单元值为0, CFree中值为很大的负数有无统一方法
我有更好的答案
那就用判断&=0吧
采纳率:90%
没有 C语言需要程序员自己检查初始化变量是个好习惯还有VC6没有赋值的单元不是0 而是用0xcc填充字节
可是初始化是要耗很多时间的,可以不初始化吗?就利用您说的0xcc填充字节 特性
不好 用memset设置很快的
你可以先初始化啊!!!初始化为0就行了。
可是初始化是要耗很多时间的,不初始化可以辨别吗?
不行,C-free是随机数,辨别不了。
定义数组的时候就初始化一下....
可是逐一初始化是要耗很多时间的,不初始化可以辨别吗?
int a[10]={0,1,2,3,4,5,6,7,8,9};这样定义,初值就确定了
其他1条回答
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c语言中,定义数组和引用数组时,其数组的下标的数据类型分别允许是什么?_百度知道
c语言中,定义数组和引用数组时,其数组的下标的数据类型分别允许是什么?
我有更好的答案
C89/C90标准:定义数组时下标只允许使用整型、字符型常量。引用数组时下标可以使用整型、字符型的常量或者变量。C99标准:定义数组时下标可以使用整型、字符型的常量或变量,但变量必须已经赋值。引用数组时下标可以使用整型、字符型的常量或者变量。以上所说的常量及变量均包含表达式。
采纳率:94%
来自团队:
字符型的常量或者变量;C99标准:定义数组时下标可以使用整型、字符型的常量或变量,但变量必须已经赋值;引用数组时下标可以使用整型、字符型的常量或者变量、字符型常量,引用数组时下标可以使用整型C89/C90标准:定义数组时下标只允许使用整型
本回答被网友采纳
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。论文发表、论文指导
周一至周五
9:00&22:00
C语言数组应用示例
  摘要:本文着重研究C语言数组应用问题。 中国论文网 http://www.xzbu.com/2/view-421751.htm  关键词:C语言 数组应用 程序      C语言是国内外广泛使用的结构化程序设计语言,它功能丰富、表达能力强、使用方便灵活、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多优点。因此,C语言既可以用于开发系统软件,也可以用来开发应用软件,应用面非常广,许多大型的软件都是采用C语言开发的。   目前多数高等院校不仅计算机专业开设C语言这门课,而且,非计算机专业也有很多开设了这门课。同时亦有很多学生选择了C语言作为参加全国计算机等级考试(二级)的考试科目。   当然,近年来,许多其他大型化的软件百花齐放,C语言的地位也受到了很大冲击,但它在高等职业和中等职业的教学中仍然扮演着非常重要的角色。   在C语言的许多实际应用中,需要存储与处理大量的数据,例如,在数值计算中、向量和矩阵的运算,它们不但有多个数据,而且各数据之间有一定的次序。再如,在数据处理中,一张表格也有多个数据和行列之间的顺序关系。诸如此类,数据量大,数据之间有一定的次序关系的问题,如果用简单的变量来表示,由于简单变量都是各自独立的,相互之间没有什么内在的联系,不仅十分繁琐,而且很难描述它们之间的顺序关系,当数据量很大时候,使用数量有限的简单变量是无法做到的。程序处理的对象是数据,数据的关系是多样化的,为了便于存储和处理大批量的或有一定内在联系的数据,需要将多个变量组织成一定的结构形式,这就是C语言中数组及数组元素。   把数组简单理解为存储数据的一组变量,这样定义和理解数组应用是不够的,数组是一组有序的变量序列,可以用序列的逻辑关系来进行数值和信息的处理,构造新的算法,比如超大值的算法问题就可以用数组来完成,如:几十位、几百位数相加用普通的方法是不能够实现的,在这里,数组的每一个元素对应的是十进制的一位数字,数组每一位元素的取得可以由数组赋值语句取得也可以由十进制数取得,对于一组十进制数可以计算其长度然后除以它的位权再取整,将整数部分赋值给数组相对应的数组元素即可。   例一:a{i}+x数组a{i}与十进制数x相加   这里数组a[i]中每个数组元素代表一个十进制数字,a[0]代表个位,a[1]代表十位,a[i]就代表了一组十进制数。   for(i=0;i<=x;i++)做 X次循环   {a[0]++;X次循环每次a数组加1   if (a[0]=10)当个位满10时   {a[0]=0; 个位置0   a[1]++; 进位   for(k=1;k<=i-2;k++) 将数组个位以上各位处理进位   {if(a[k]=10)   {a[k]=0;   a[k+1]++;   }}}}   这是比较简单的情形,还可以进一步考虑两个数组的加法,c[k]=a[i]+b[j],那样的算法要复杂些,先将数组对应位置的数据相加,然后处理结果中进位问题。   例二:10位数组a[10]*x数组a{i}与十进制数x相乘   i=2;   while(i<=x) x次循环,每次循环a[10]自加一次   {for(l=0;l<=9;l++)a[10]自身复制给b[10]   b[l]=a[l];   for(k=1;k<=i;k++)   {for(j=0;j<=9;j++) 对a[10]数组每位进行进位处理   {a[j]=a[j]+b[j];   if (a[j]>=10)   {a[j]=a[j]-10;   a[j+1]++;   }}}}   减法的算法要复杂的多,数组形式的数与一个十进制数相减,减数每次循环自减1,至0为止,被减数每次自减1,不够减的时候进行借位处理,即:a[i+1]--,还得考虑重复借位,如果减数是数组形式那减数每次做减1操作时候要考虑借位及连续借位的为题,比较复杂。   除法相对最为复杂,可将被减数减去减数(参照减法操作),累计次数,累计值即为商,如要考虑小数则更为复杂。   例三:求100!   100!的运算结果达到一百多位,这样超大值的计算,普通的方法是无法完成的,利用数组就可以比较方便地来实现100!的计算,将数组中的每一个元素作为100!计算中的一位数字,a[0]为个位,a[1]为十位,将乘法用加法来代替,例如a*3可以当做a自加三次,对这种数组形式的运算来说则要在每加一次以后进行进位处理,即数组中每个元素如果有进位则要进行进位处理。   设置两个数组a、b,包含170个数组元素,即a[0]―a[169]、b[0]―b[169],其中b数组为中间数据处理数组,将a数组置初值1,当i值为 2、3、4……100时候做i次的循环,每次a数组自加i次,每加一次做一次进位处理,结束时,a数组的结果就是100!。   main()   {int a[170],b[170]; 定义数组   int i,j,k,l; 设置变量   for(i=0;i<=169;i++)置数组初值   {a[i]=0;   b[i]=0;}   a[0]=1;a数组置1   i=2;   while(i<=100) i值在2----100时 进行循环   {for(l=0;l<=169;l++)   b[l]=a[l]; a数组中间结果存b数组   for(k=1;k<=i;k++) a数组自加操作   {for(j=0;j<=168;j++)   {a[j]=a[j]+b[j];   if (a[j]>=10)进位处理   {a[j]=a[j]-10;   a[j+1]++;   }}}   i++;}   for(j=169;j>=0;j--)显示结果   printf("%d",a[j]);}   当前在高职高专计算机教学中,c语言教学更多是用来培养学生建立程序设计的理念,即:根据问题建立数据模型、通过编程解决数据模型,而在本例中,100!运算数据量大,普通变量难以承担这样的计算,通过对数组应用的学习,使学生了解数组的概念、特性,就可以通过数组建立超大数据模型来解决解决类似问题,数组每一个元素就是数据中的一位数字,这就解决了位数不够的问题。同时,还要解决运算方式的问题,数组每一个元素是代表一位数字,所以当然不能用常规的加、减、乘、除、乘方等现成的算法,而是要通过编程建立新的运算方法,通过调用这些程序实现数组形式的数据运算。
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 js 判断变量是数组 的文章

 

随机推荐