首页 > 编程知识 正文

指针初始化和赋值的区别,c语言指针定义并赋初值

时间:2023-05-06 19:08:42 阅读:58070 作者:4322

1、指针初始化

初始化指针时,“=”的右操作数必须是内存中数据的地址,不能是变量,也不能直接使用整数地址值(但此语句指示指针为空)。 此时,p只是表示指针变量已被定义,没有间接取值的意义。

例如:

int a=25;

int *ptr=a;

int b[10];

int *point=b;

int *p=b[0];

假设: int *p;

*p=7; 编译器(vs2008 )请求the variable ' p ' isbeingusedwithoutbeinginitialized .即使使用未初始化的变量p也是如此。

p指向具有7的地址,*p=7为p指向的存储器分配值,p未分配值,因此p指向的存储器位置不是随机初始化的。

int k;

int *p;

p=k; 给//P赋值

*p=7; 向//P所指内存分配值,即k=7

2、指针分配

int *p;

int a;

int b[1];

p=a;

p=b;

的赋值中,“=”的左操作数既可以是*p,也可以是p。

在"="的左操作数为*p的情况下,变更的是保存在p所指的地址中的数据;

“=”的左操作数为p时,变更的是p指向的地址。

的变量名b表示该数组的起始地址,因此p=b; 是正确的

相同类型的指针分配:

int val1=18,val2=19;

int p1、p2;

p1=val1;

p2=val2;

p1=p2; //注意啦,p1指的是val2,而不是val1

注意:初始化和赋值字符串和指针

初始化:

char *cp='abcdefg '; //该初始化过程将指针cp指向字符串的起始地址,而不是传递字符串的值。 为什么这么说,是因为c语言没有批量处理字符串的机制

赋值:

cp='abcdefg ';

cp=”abcdefg”; //错了! 字符串常量传递起始地址,字符串值不能在cp中更改。 因为字符串是常量,所以只需将指针指向字符串常量

3、指针常数

因为c语言没有表示指针常数的内置(built-in )方法,所以我们使用它时通常先写成整数常数的形式,然后强制类型转换为对应的类型。 例如,int *、double *、char *等。 所以后面看到的做法是不行的。 int *p=0x12345678; 正确的方法是: int *p=(int * )0x12345678; 请注意,指针只能包含地址。 不能将非0整数常量表达式或非地址类型的数据分配给指针。 其理由就在于此。 在大多数计算机中,存储器地址确实是用无符号整数表示的,经常用十六进制表示,但是用c语言不能用整数表示地址,只能用指针常数表示,这是因为分配给指针。

对于这个赋值问题,也可以有别的看法。 在c语言中,使用赋值运算符时,赋值运算符左边和右边的表达式类型必须相同。 假设不是,赋值运算符将尝试将右边表达式的值转换为左边的类型。 因此,假设导出为int *p=0x12345678; 此语句编译器报告错误。 '=' : cannotconvertfrom ' constint ' to ' int * '的赋值运算符左边和右边表达式的类型应该相同,0x12345678是int类型常量,p是指向int类型的指针,由于两者不同

4、指针初始化补充

ANSI C定义了零指针常数的概念。 如果具有0值的整形常量表达式或此类表达式被强制转换为void类型,则它称为空指针常量,可以初始化或分配给任何类型的指针。 也就是说,可以将0,0l、'/0 '、22,05和(void * ) 0指定给任何类型的指针。 然后,该指针将是空指针,系统将确保空指针不指向任何对象或函数。

ANSI C还定义了表示空指针常量的宏NULL。 在大多数c语言实现中,NULL定义如下: #定义空值((void * )0)。

初始化指针时常用的方法是:

采用空值或空指针常数。 例如int *p=NULL; 或char *p=2-2; 或浮动* p=0;

2 .获取对象的地址,并将其分配给指针。 例如,int i=3; int *ip=i;

将指针常量分配给指针,如long *p=(long * )0xf

ffffff0;

4.将一个T类型数组的名字赋给一个同样类型的指针,如:char ary[100]; char *cp = ary;

5.将一个指针的地址赋给一个指针,如:int i = 3; int *ip = &i;int **pp = &ip;

6.将一个字符串常量赋给一个字符指针,如:char *cp = “abcdefg”;

对指针进行初始化或赋值的实质是将地址或同类型(或相兼容的类型)的指针赋给它,而无论这个地址是怎么取得的。要注意的是:对于一个不确定要指向何种类型的指针,在定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用空指针。另外,为程序中不论什么新创建的变量提供一个合法的初始值是一个好习惯,它能够帮你避免一些不必要的麻烦。

5、*void 型指针

ANSI C定义了一种void *型指针,表示定义一个指针,但不指定它指向何种类型的数据。void *型指针作为一种通用的指针,能够和其他不论什么类型的指针(函数指针除外)相互转化而不须要类型强制转换,但不能对它进行解引用及下标操作。C语言中的malloc函数的返回值就是一个void *型指针,我们能够把它直接赋给一个其他类型的指针,但从安全的编程风格角度以及兼容性上讲,不妨将返回的指针强制转换为所需的类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为“内存分配失败”的信号,所以要注意返回值指针的判空。

6、指向指针的指针

在指针初始化的第5种方式中提到了用一个指针的地址来初始化一个指针。回顾一下上一讲的内容:指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们能够将指针的地址存放在还有一个指针中,如:

int i = 5000;

int *pi = &i;

int **ppi = π

此时的ppi即是一个指向指针的指针,下图表示了这些对象:

[图片上传失败...(image-c8ffbf-1542704513643)]

i的地址为108,pi的内容就是i的地址,而pi的地址为104,ppi的内容即是pi的地址。对ppi解引用照常会得到ppi所指的对象,所获得的对象是指向int型变量的指针pi。想要真正地訪问到i.,必须对ppi进行两次解引用,如以下代码所看到的:

printf("%d", i );

printf("%d", *pi );

printf("%d", **ppi );

以上三条语句的输出均为5000。

文章来源于csdn:https://www.cnblogs.com/mfrbuaa/p/3756342.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。