指针变量初始化,指针初始化
指针变量初始化,指针初始化详细介绍
本文目录一览: 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语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。
指针变量初始化为NULL什么意思?
NULL的定义是这样的
#define NULL ((void *)0)
应用程序是不能访问0地址的,所以可以用0地址来表示一个空指针。
if(ptr != NULL)/*确保指针已经被初始化*/
{}
将指针初始化NULL即将指针初始化为0。
NULL宏是定义在标准库头文件stddef.h中。宏定义如下:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
可以看出c++中
NULL为(int)0
,
C中NULL为(void*)0。看来C和C++中NULL宏的值略有不同。
定义一个指针变量intp,将其初始化为未指向任何对象的语句?
您可以使用以下语句来初始化指针变量p:
codeint* p = NULL;
这将初始化指针变量p为一个空指针,它没有指向任何对象。
您也可以使用以下语句来初始化指针变量p:
codeint* p;
p = NULL;
这两种方法都可以用来初始化指针变量p为一个空指针。
指针变量在使用前必须初始化是什么意思?
指针初始化其实就是给这个指针一个内存地址,如果你不初始化这个指针就去使用,那么必定会造成指针访问非法内存
因为未初始化的指针指向哪里,你根本就不知道,使用后结果不可预知,如果指向的内存中比较重要的地方,可能会导致系统异常,比如提示指向了一个不可用的地址之类的
举例说明:
sss类型的指针
sss* p=new sss();
就是 使用前,这个指针必须指向某个存储空间。
C语言中的“char指针初始化”是什么意思?
char 指针,也就是char *类型。 其初始化本质上与其它变量初始化没有什么区别,就是赋予其一个初始化的值。\x0d\x0a对于指针来说,在C语言中,就是一个地址。区分初始化情况,有四种表象:\x0d\x0a1 初始化为空。即\x0d\x0achar * str = NULL;\x0d\x0a的形式,NULL在C语言中是特定的空指针,其值为0.在C语言中,以NULL作为指针的一个未生效状态,其本身是一个非法的地址值。\x0d\x0a\x0d\x0a2 初始化为常量字符串地址。\x0d\x0achar * str = "test";\x0d\x0a常量字符串在运行时会被放在常量空间中,于是这样初始化后,地址是常量空间中的一个地址,对于该地址只能读取,不可写入。即str的值可以改,但是str指向的值是不可修改的。\x0d\x0a\x0d\x0a3 初始化为变量地址。\x0d\x0a这里的变量地址,包括全局变量,局部变量的地址,以及通过动态分配申请到的内存地址。\x0d\x0a这种情况下,对指针指向的空间是可以修改的。\x0d\x0a\x0d\x0a4 不做初始化。\x0d\x0a这种情况在C语言中是允许的。如果为全局变量或静态局部变量,系统默认初始化为0值,即NULL。而对于局部变量,将是一个随机值。所以如果是局部变量不做初始化,在取其指向空间值前,必须为其指定一个合法的值,否则访问会出错。
指针变量初始化为NULL什么意思
将指针初始化NULL即将指针初始化为0。
NULL宏是定义在标准库头文件stddef.h中。宏定义如下:
#undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif 可以看出c++中 NULL为(int)0 , C中NULL为(void*)0。看来C和C++中NULL宏的值略有不同。
1)不一定要初始化,但是不初始化的话该指针指向一个未知的位置,而这可能是未来程序的隐患。
2)NUll的意思就是使指针为空不指向任何地址。
NULL的定义是这样的
#define NULL ((void *)0)
应用程序是不能访问0地址的,所以可以用0地址来表示一个空指针。
if(ptr != NULL)/*确保指针已经被初始化*/
{}
NULL的定义是这样的
#define NULL ((void *)0)
应用程序是不能访问0地址的,所以可以用0地址来表示一个空指针。
if(ptr != NULL)/*确保指针已经被初始化*/
{}
1.指针变量和普通变量一样,可以用来定义语句或者赋值语句的初始化,一般可以把指针为0,NULL,或某个地址。对指针初始化可以防止出现意想不到的结果。
2.指针变量被初始化为NULL时,表示该指针不指向任何值。把它初始化为0其实也等价于把它初始化为NULL,但一般使用NULL,0是唯一一个能够被直接赋予给指针变量的整型数。
1.为什么指针变量定义时一定要初始化?
答:因为你首先要理解一点.内存空间不是你分配了才可以使用
只是你分配了之后使用才安全,为什么要进行对他初始化呢
因为,如果你没对他初始化,而引用这个指针并却其指向的内存进行修改
因为指针未被初始化,所以指针所指向的也是随机的,他是个野指针,如果你引用指针,并修改这个指针所指向的内容,而如果这个指针所指向的内容恰好是另外一个程序的数据的话,你将其进行修改了,就会导致另外一个程序可能不能正常运行了.所以使用前一定要进行初始化
2.指针变量初始化为NULL是什么意思?
答:意思是说,强指针变量置空,初始化为NULL,使它不指向任何内容,这样引用她也不会出现上面的问题
总之一点,记住在使用指针之前要对它进行初始化操作就可以了
如何创建指向字符串变量的指针数组及初始化?
1、在运行命令中输入”char *str[]={"Hello","C++","World"}“。
2、按照步骤运行命令:#include
,#include
,void main(){char *str[] = {"Hello", "C++", "World"}。char **p;for(p=str; p
<str+3; p++)puts(*p); }
指针数组是指在C语言和C++语言中,数组元素全为指针的数组。
指针数组可以作为函数的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
指针初始化
指针的初始化一:
int i;
int *p;
p=&i;
二:如果在数组中
int a[10];
int *p;
p=&a[0];或者p=a;
也就是说在数组中给指针变量初始化可以没有&
三:int *p=NULL 说明指针指向空,所以不用加&
同志,搞清楚这个问题的关键是分清楚类型一致。
p为指针故只能将一个变量的地址赋给它 , 初始化的意思就是第一次出现该指针的赋值动作。
后续对它的操作时赋值而不能说是初始化。 至于NULL该变量是一个被系统定义为空指针的标记。
声明了一个指针变量 int *p后,p的址址即告确定,但p的值是随机值,会指到哪里去谁也不知道,所以叫“野指针”。只有对p人为进行赋值后,p的值才可控,特别的,对p的第一次人为赋值,称为初始化。所以你提到的第一、二种方法都是初始化。
关于赋给p的应该是什么值,不要太着相了,p就是个4字节变量而己,理论上4字节长的数值都可以赋,当然实际上出于安全考虑,不会这么乱来。举例来说:
(1)&i:就是i的地址。其实也是一个数值,只是省了你自己查找i地址的麻烦。
(2)i:如是i是一个整型变量,并且其数值作为地址是有意义的,就可以
(3)NULL:就是0。0作为地址可以吗?当然可以。你写成int *p=0也一样。
综上:只声明、没赋值过的指针都是野指针,初始化就是第一次赋值。能赋给指针的,只要是可以解释为地址的数值都可以。
指针的初始化,intp=“abcd”和intp=&a有什么不同?其中a也是整形变量
int *p 是 变量声明,声明 p 是指针,用于指向 整型量。
int *p=“abcd” ; 声明并初始化。用了错误的表达,因为 p 是整型 指针,初始化 要 赋给int 型 变量的地址,而不是双引号括起的 “字符串常量”。
int *p=&a; 声明并初始化。 初始化,让 p 指向 a 的地址。 a 应当是 已知的 int a.
&a 是 a 的地址。 是正确的 表达方式。