A. c语言声明定义
不会出错的。
只有说所有变量声明、定义语句必须在其他执行语句之前。
这里int num = 10;也是定义语句,不算是赋值语句。
而且好像这条规则是较早版C语言中才有的,后来的C语言规范已经没有这条要求了
B. c语言 声明部分怎么 选择
声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等。
C. 回顾c语言中声明和定义的区别
简单地说,声明就是告知编译器,后续代码中会有这样东西,而定义是告知编译器真的申请一块内存来存储这样东西。
对于变量来说,声明和定义几乎是相同的,尤其是在同一个文件中声明或者定义变量。但如果是使用其他源文件中的变量,可以使用extern关键字进行声明,表示该变量由其他人定义,我这边仅仅是拿过来用一下。
对于函数来说,如果只给定了函数的名称、参数列表和返回值,就是声明,告知使用者函数的样子,而定义是除了声明的三部分之外,还要包含函数体,说明函数是如何实现的。
D. c语言如何定义一个单项列表
#include<iostream>
usingnamespacestd;
structA
{
intx;
A*next;
};
A*Head;//头指针
intk=0;//记录创建链表个数
A*J_L();//创建链表
voidB_J(A*head,intx);//比较大小
voidshow(A*head);//输出
voidmain()
{
A*t;
t=J_L();
B_J(t,k);
show(t);
}
voidB_J(A*head,intx)
{
A*m,*n;
intswap;
for(inti=0;i<(x-1);i++)
{
n=head;
m=n->next;
for(intj=0;j<(x-i-1);j++)
{
if((n->x)>(m->x))
{swap=n->x;n->x=m->x;m->x=swap;}
n=n->next;
m=n->next;
}
}
}
voidshow(A*head)
{
A*t=head;
while(t!=NULL)
{
cout<<t->x<<endl;
t=t->next;
}
}
A*J_L()
{
cout<<"请输入,0退出";
A*p=newA;
k++;
A*d=Head=p;
cin>>p->x;
if(p->x==0)
{
k--;
deletep;Head=0;p=0;
}
while(1)
{
cout<<"请输入,0退出";
p=newA;
k++;
d->next=p;
cin>>p->x;
if(p->x==0)
{k--;deletep;d->next=0;p=0;break;}
d=p;
}
returnHead;
}
E. c语言数组声明问题
一般有四种数组定义方式,以一维数组为例:
//定义指定维数的数组
int arr[10];
//定义不指定维数的数组,数组维数有初化列表元素个数决定。
int arr[] = {1,2,4};
//定义指定维数的数组,初始化不完全时,系统将未初始化元素初始化为0
int arr[10] = {1,2};
//动态分配一个数组。下面分配了一个有10个元素的数组。
int *arr =(int *) malloc(10 * sizeof(int));
F. c语言的定义与声明是什么
声明就是声明一下我用到的变量或者类型,变量或者类型的实际定义并不一定在本文件内。
给变量分配了空间才叫做定义,否则就是声明
比如extern int a; 是声明,a的定义是在别处,这里并没有为a分配空间。
比如int a;即是定义
函数以及类型,声明就是用函数或者类型的头部来声明
比如 struct x;声明 struct x{};定义
比如 int fun();声明 int fun(){}定义
G. 关于C语言变量和数组的声明问题
首先声明变量了是有内存分配的。
如果定义数组后可以得到连续的内存分配(有时候特别占用空间)。所以C语言出了链表(可以不连续的村一组数据)。
下面是C语言内存分配特性,可以参考。
1、C中内存分为四个区
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。
程序代码区:用来存放程序的二进制代码。
例子(一)
int a = 0; //全局区
void main()
{
int b; //栈
char s[] = abc; //s在栈,abc在文字常量区
char *p1,*p2; //栈
char *p3 = 123456; //123456在常量区,p3在栈上
static int c =0; //全局区
p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆
p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆
strcpy(p1, 123456); //123456放在常量区
}
例子(二)
//返回char型指针
char *f()
{
//s数组存放于栈上
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据
}
2、动态分配释放内存
用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。
内存分配成功后要对内存单元进行初始化。
内存分配成功且初始化后使用时别越界了。
内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。
NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
请问运行Test函数后会是什么样的结果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
问题同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,hello);
printf(str);
}
问题同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)
{
strcpy(str,world);
printf(str);
}
}
问题同NO.1
我对以上问题的分析:
NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char类型的指针p,2把str的内容到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串helloworld拷贝到str指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在!(建议:画图理解)
NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"helloworld"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.
NO.3:正确答案为可以打印出hello.但内存泄漏了!
NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语句永远都不能被执行.这也是着名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误.
H. 关于c语言的函数声明
因为函数jiec()是你自己定义并编辑的,在C语言中凡是操作员自己定义的函数都要在使用前申明,在C语言中系统自带的函数是通过include语句进行引用定义的,比如字符函数通过include<string.h>进行申明,即你要引用的字符函数都在string.h里定义了
I. c语言如何声明字符串
C语言中没有字符串类型的变量。
他只有字符变量类型char,所以字符串用变通的方式来表示。
第一是字符数组来表示字符串。用下面的语句声明:
char a[10];
C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符'\0',而字符数组不需要。
如刚才声明的a[10]是一个含有10个元素的字符数组,它也能存放含有9个元素的字符串。
第二种方式是直接用指针。语句是:
char *a;
用指针声明的字符数组,大多数功能与字符数组表示字符串相同。但也有以下两点不同,一是储存位置不同,用字符数组表示时,字符串是存放在储存器的变量区域内;而用指针表示的字符数组是存储在储存器的常量区内;第二个区别是字符数组的字符串可以更改,而指针表示的字符串不能更改。
有关字符串的赋值方法,如何引用,请参考相关书籍。
有什么问题请留言。