㈠ 关于c语言的 变量 地址 和 值
以下是个人理解:
变量具有类型,而类型是编译器用来分配存储空间的模板,比如int型分配4个字节,也就是分配了32位。所以,定义一个变量并不代表分配了一个空间,只是定义了一个分配模板。
只有使用了已经定义的变量,才为其分配空间,如int i=0;
分配空间给所定义的变量和使用变量,两个的本质是一样的,并且分配了空间就是使用变量来存储数值。而存储了值的那个变量的空间是内存里的存储单元,所以变量在内存中有一个地址,这个地址是随机的,也只有使用变量时候才分配的。
其实,直接访问变量就是直接访问一个地址,等价于访问一个指针,如果一个变量里存储的值是另一地址,那么就把这个变量当做指针!
本质上,指针和变量没有任何区别,他们的区别在于:为指针分配的地址空间是固定的,如32位机器就分配32位,64位机器就分配64位;而为变量分配的地址空间是因不同约定的类型的不同而不同的,这里说的是约定的类型,如int分配4个字节,long int分配8个字节,float分配4个字节。
(以上的一些变量类型所占的字节是因为编译平台和编译机器不同而会有所区别,但现在的机器和平台几乎都是如此的。)
㈡ c语言栈的初始值存在哪里
栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所在位置。
C语言初始化——栈的初始化 栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出。
㈢ C语言中的数组定义初始值等问题。
二维数组第一维界限可以省略,具体由第二维界限确定。
对于a[][3]={1,2,3},第二维界限是3,数组元素共3个,因此第一维界限为1。
对于d[3][2]={{1,2},{34}},明确给出了第一维界限、第二维界限,后面各行数组元素部分赋值,部分未赋值。赋值的是d[0][0]、d[0][1]、d[1][0],其余未赋值。
㈣ C语言数组初始赋值问题
#include<stdio.h>
#defineN1001
intmain()
{
inta[N]={1};//这样是不能把a数组全部赋值为1的,这样结果是赋值10000...
intl,n,cnt=0,i,c,b;
scanf("%d%d",&l,&n);
for(inti=0;i<=l;i++)//要先遍历赋值为1,后面再置0,不然只有第一个是1
a[i]=1;
while(n--)
{
scanf("%d%d",&c,&b);
for(i=c;i<=b;i++)
a[i]=0;
}
for(i=0;i<=l;i++)
if(a[i]==1)
cnt++;
printf("%d ",cnt);
return0;
}
而你初始赋值0之所以得到298,是因为你后来是置1的,自然有得数
而a[N]={1}赋值,除了第一个是1,后面本就全是0,再赋值0,cnt一定等于1
㈤ C语言程序中定义的变量要取得一个初始值一般有哪几种方法
定义变量取初值:
一、不指定:
全局及静态变量默认0,局部变量随机值。
二、定义同时赋初值:
比如int a=1;char str[]="abc";
三、定义时未赋初值,在使用前赋值。
比如int a;a=1;printf("%d",a);
ps:注意函数内静态变量定义给初值和之后赋值是有区别的,静态变量的定义赋初值语句,只在第一次调用函数时执行,如定义之后有重新赋值的语句,再次调用函数,静态变量会保留上次赋值的结果。
㈥ c语言给数组赋初始值是不是实际就是给数组元素赋值呢
是的.
a[2]={1,4,59}是错误的.
应该这样:a[2]={1,4};数组a中有两个元素.
或者a[]={1,4,59}//让编译器自动计算数组中的元素个数.
一般初始化可以这样a[2]={0}让数组的两个元素都初始为0
对于二维以上的就这样a[2][3]={{0}};//比一维多一对大括号{}
三维就a[2][3][4]={{{0}}}
㈦ c语言初始化赋值的一般形式公式
C语言的变量初始化,就是在定义变量的时候,赋予一个初始值。
形式为
type var_name = init_value;
其中init_value就是初始化值了。
类似于
type var_name;
var_name = init_value;
不过,基于编译器的实现,一般初始化值的方式要比先定义后赋值更高效。另外,有些初始化是必须的。比如常量的定义,必须在定义的时候赋予初始化值。
图注意事项:要借助工具作图;是实际光
㈧ c语言中申请地址和初始化问题,(乱七八糟,我是新手)<dev c++>
int a;
while(a<=200)
{...}
这样的话,a没有初始化,是不可预料的值,所以完全可能不进入循环,肯定不行的。
int a=0;吧,初始化为0,从0开始,就对了。
㈨ C语言中,对于未初始化的指针变量,其默认值是一个地址,该地址中的内容可能重要,也可能不重要,如果不
一、指针变量的初始化问题
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须进行初始化,指针的 初始值必须是一个地址,决不允许赋予任何其他数据, 通常是一个数据的地址或地址 变量或空指针。
1、指针变量未被初始化
指针变量未被初始化,指针变量就不会被分配存储空间。在程序中如果使用了未被分配 空间的指针,就会出现难以查找的错误。
如在程序
main()
{int x, p;
x= 100;
*p= x;
printf(“*p=%d\n”,p);
}
中,指针变量p因没有初始化,在执行语句*p= x;之前p的内容是未知的,当程序将100赋给 一个没有确定指向内存的指针变量p,而使得数据100被存入一个未知的单元。这个程序虽然 很小,所占的内存小,问题不明显,但实质上它却隐含着一个致命的错误。这是因为随着程 序的增大,很有可能访问到致命的地址单元,将会导致计算机系统工作区域内有用数据的破 坏,引起数据段操作系统的损毁,造成机器运行失常,甚至 “死机”。
解决方法是指针必须初始化后,才能使用。
本例中 p=&x; 程序便可正常运行。
2、指针初始值可赋值为空值
指针变量值为0的指针称为零指针(空指针)。其表示形式为int *p=0;表示p指向地 址为0的单元,系统保证该单元不作其他应用,表示指针变量值没有意义。可以写成:
#define NULL (void *)0
int *p=NULL;
定义零指针主要用于避免指针变量的非法引用和在程序中比较指针变量是否为空两个方 面。因此,不能把一个空指针用于除此之外的其他比较。若某些系统允许第0号内存既可以 被写入也可以被读出,这时错用空指针可能会改写操作系统的一部分内容,从而使系统彻底 崩溃;若系统只允许读0号内存,这时空指针指向一个有用的字符串;若系统对0号单元实行 写保护,则对空指针的操作将失败。.因此,使用空指针时要特别小心。
二、指针变量赋值问题
1、指针赋值带来的内存丢失
在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如:
main()
{float *a, *b;
a=(float)malloc( sizeof( float));
b=(float)malloc( sizeof( float));
*a= 227. 5;
*b= 163. 9;
a= b;
printf(“%f,%f,*a, *b);
}
上例中将指针变量b赋给了指针变量a,使a与b都指向分配给b的内存空间,而原先分配 给a的内存空间未释放,不能再被其它任何程序访问,该内存空间成了“无效内存块”,内 存空间“丢失”了,而a后来指向的内存单元又直接或间接地被反复调用,内存愈来愈紧张 ,最终“死机”。
解决方法:一个指针变量赋给另一个指针变量前,应先用free( )释放所占有的内存空 间,使这部分空间可以由系统重新支配,即应在赋值语句前执行:free (a)。
2、指针变量赋值错误
C语言规定,一个指针变量只能指向同类型的变量,不能时而指向一个整型变量,时而 指向一个字符型变量。当然,如果程序中确实需要进行不同类型的 指针变量进行赋值时, 则需要进行强制类型转换。
3、混淆指针变量和它所指向的数据而导致程序错误
如在程序
main()
{int x, *p;
x= 10; p= x;
printf(“%d”,*p);
}
中,语句p= x把数据10而不是10所对应的单元地址赋给指针变量p,因而printf()调用 语句无法在屏幕上显示x的值。
三、指针用于数组时应注意的问题
1、混淆数组名与指针变量的区别
main()
{int i, a[ 8];
for( i= 0; i< 8; i++)
scanf(“%d”,a++);
}
分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此.数组名不能自增自减 ,也不能在赋值语句中作左值.例程中企图通过对a的改变使指针下移,指向欲输入数据的数 组元素。它的错误在于不了解数组名代表的是数组首地址,是一个地址常量,而地址常量的 值是不能改变的。
2、指针越界错误
由于对内存中数据放置的错误假定,导致指针超出数据对象所占内存空间的大小。
例:main()
{int a[5], b[5] ;
int *p, i ;
p=a;
for (i=0; i<10:i++) *p++=i;}
分析:该程序想通过指针变量p的自加运算来完成用0~9初始化数组a和b,但这是建立 在数组a和b相邻存放的基础上的,事实上这种情况并不一定成立。
3、混淆数组与指针的区别
例:main()
{char *p=“beijing”;
p[0]= ‘B’;}
分析:程序没有正确区分数组和指针。在C语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。
㈩ 关于C语言的 变量 地址 和 值
地址和指针是紧密相连的,首先值是放在内存中的一个区域,而内存中的区域都会有不同的编号,这些编号可以认为就是地址。
例如:int*
a是指针变量,int
b=3,
a=b,则是错误的,此时a是不等于3的,因为a是指针变量,你不能把b的值赋给它。应该是
b的地址
a=&b,就是正确的,此时a存放的就是b的值在内存中的地址
如果你输出printf(“%d”,a)与printf(“%d”,*a)
结果是不一样
前者输出的是b在内存中的地址,后者输出的是指针a
指向b的地址的值(即b的值3)