int指针初始化_C语言学习|指针变量作为函数参数

9a2f6c460028c745ee5227efef0477f1.png

一、定义某一变量的指针

为了在一个变量中存放另一变量的地址,这个变量必须定义为指针类型的变量,与其他类型一样,指针变量也要遵循“先定义后使用”的原则,定义指针变量的一般形式如下:

类型关键字 *变量名;

其中,变量名前面的*是指针类型说明符,表示这里定义的是一个指针类型的变量,最前面的类型关键字用于指定该指针变量可以指向哪一种类型的变量,或者说用哪一种类型的变量的地址对其进行初始化,我们称其为指针的基类型。例如,下面语句定义了两个可以指向整型数据的指针变量p1和p2;

int *p1,*p2;

如果将这条变量定义语句写成:

int *p1,p2;

那么它绝不是定义了两个整型指针,这里的*只对变量定义的p1起作用。用来声明指针变量的*,不会对一个变量定义语句中的所有变量都起作用。因此,为了防止像上面这样在一个变量定义语句中同时定义指针变量和非指针变量而带来的混淆,最好是在一个变量定义语句中只定义一个指针变量。

此外还需要注意的是,前面第一条变量定义语句仅仅定义了两个“可以”指向整型数据的指针变量p1和p2,但此时p1和p2究竟指向哪里,我们并不知道,因为未初始化的指针变量的值是随机不确定的,即乱码。

若要指针变量确定指向某个变量,则需要对其初始化。例如:

int a, b;

int *p1=&a,*p2=&b;

注意,上面语句中的符号*只是指针类型说明符,不是指针运算符。所以上面这条语句不能理解为将&a和&b的值分别赋值给p1和p2所指向的变量。事实上,它相当于·

int *p1,*p2;

int a,b;

p1=&a;

p2=&b;

其含义为:先定义两个可以指向整型数据的指针变量p1和p2,然后将整型变量a和b的地址分别赋值给指针变量p1和p2。这样,p1和p2就分别指向了整型变量a和b。指针变量p1与之间a的关系举个例子如图:

80a68a8e9c9256dad6bdd59d02ef8f47.png

小提示:指针变量尽量在定义时进行初始化,以避免后面因为忘记为其赋值而造成对未知内存非法访问

因为表达式*p1引用的是p1所指向的变量a,所以语句:

*p1=10;

实际上相当于将整型常量10赋值给了变量a,而语句:

b=*p1;

相当于将p1所指向的变量a的内容赋值给b。

注意:*p1类型是p1所指向的变量的类型。

再如,表达式&(*p1)的值代表的是变量a的地址,而*(&a)引用的则是变量a的值。

二、指针变量的特点

指针变量也是一种变量,它与其它类型变量有相同处,如都在内存中用一定的存储空间,都需“先定义,后使用”等。但指针变量又有其特殊性,有以下四点:

1.指针变量的内容不能是变量的值,只能是变量的地址,而且必须用相同基类型的变量的地址对指针变量进行赋值。例如:

int x,*p;

float y;

则下面两种用于指针初始化的赋值语句都是错误的;

p=x;//错误,指针p的内容应为地址值

p=&y;//错误,必须用相同基类型的变量的地址对指针赋值

正确的初始化语句应该为:

p=&x;

2.指针变量必须初始化后才能使用,不要使用未初始化的指针,否则指针所指向的存储单元是未确定的。使用未初始化的指针是非常严重的错误。

如下面的程序所示,在不知道指针变量究竟指向哪里的情况下,如果直接对它所指向的存储单元进行写操作,则会因为非法内存访问而使程序异常终止。指针的强大在于它可以指向内存的任何地方,并且可以通过指针修改那个地方的值,但是其危险性也源于此。

注意:这是个错误的程序:

#Include

int main()

{

int x=10,*p;//指针变量p未初始化,不知道p指向哪里造成的错误

*p=x;//使用未初始化的指针p,引起非法内存访问错误

printf("%d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值