一个c语言指针变量赋值问题,求大佬解答?

今天回头复习了一下C指针用法,发现一篇讲解得不错的文章,在此记录一下:

指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空)。此时,*p仅仅是表示定义的是个指针变量,并没有间接取值的意思。

由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。

指针的赋值,“=”的左操作数能够是*p,也能够是p。

当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;

当“=”的左操作数是p时,改变的是p所指向的地址。

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

备注:字符串与指针的初始化和赋值

char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址,而并非传递字符串的值。由于,在C语言里面,没有总体处理一个字符串的机制

*cp=”abcdefg” ;//错误!字符串常量传递的是它的首地址,不能够通过*cp改动该字符串的值,由于该字符串为常量,而它仅仅是简单的将指针指向该字符串常量

在C语言中没有一种内建(built-in)的方法去表示指针常量,所以当我们使用它的时候通常先写成整型常量的形式,然后再通过强制类型转换把它转换成对应的类型,如:int * , double * , char *等。 所以后面所看到的的做法是不行的: int *p = 0x ; 正确的方式应为:int *p = (int *) 0x; 要注意指针中仅仅能存放地址,不能将一个非0值整型常量表达式或者其它非地址类型的数据赋给一个指针,原因就在此。在大多数计算机中,内存地址确实是以无符号整型数来表示的,并且多以16进制表示,但我们在C语言中不能用整型数去表示地址,仅仅能用指针常量来表示,由于它是被用来赋给一个指针的。

对于这个赋值问题还能够换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是同样的,假设不是,赋值操作符将试图把右边表达式的值转换为左边的类型。所以假设写出int *p = 0x ; 这条语句编译器会报错:'=' : cannot convert from ' const int ' to ' int * ' ,由于赋值操作符左边和右边的表达式的类型应该同样,而0x是int型常量,p是一个指向int型的指针,两者类型不同,所以正确的方式是:int *p = (int *) 0x ; 

ANSI C定义了零指针常量的概念:一个具有0值的整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它能够用来初始化或赋给不论什么类型的指针。也就是说,我们能够将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个不论什么类型的指针,此后这个指针就成为一个空指针,由系统保证空指针不指向不论什么对象或函数。

对指针进行初始化时经常使用的有下面几种方式:

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

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

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

此时的ppi即是一个指向指针的指针。

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

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

*pointer是指针指向的一个值,此时为2,这个值再自加1自然为3。

pointer此时还指向值2,减2的含义是指针回退两个元素,自然指向了值6。

指针本身有值,表示它指向的地址,这个值可以运算,表示对地址的修改。而指针指向的值,其实就是位于这个地址所存的值。

在汇编以上层次的编程中,内存实际上理解为地址和值就够了,比如说指针值为100,就相当于地址100(这实际上是一个基于基址的偏移),而说指针指向200时,实质是说位于地址100的内存存储了200这个值。

再推广到函数的参数,书上所谓的形参,变参什么的除了混淆是非,没用,只要记好何时传地址,或传值,就不会有什么问题。

在内存中是找不到指针这种有形的东西的,如果我们把内存中某个位置存放的一个数值看成指针,那这个值就是某个值所在的地址。到这个地址去找,才能知道某个值的大小。到了下一个程序运行的时候,这个位置存放的值的含义可能又变了。因此,学语法是一个长期的过程,要能理解到为什么这样是合理的,才算真正出师了

第一个,pointer下标地址为3内容为2,自加符号在前,是先加完再执行,2+1等于3
第二pointer下标地址为3,3-2等于1,下标地址为1的内容是6。
我自学c语言,这是我的理解。


· 贡献了超过121个回答

  引导语:在信息工程中,指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中的寄存器(Register)。以下是百分网小编分享给大家的C语言指针知识点,欢迎阅读!

  【考点1】指针变量

  指针变量是用来存储地址的,而一般变量是存储数值的。指针变量可指向任意一种数据类型,但不管它指向的数据占用多少字节,一个指针变量占用四个字节。

  【考点2】指针变量的定义

  格式为:类型名 *指针变量名。二维指针int **p;可以理解为基类型为(int *)类型。

  【考点3】指针变量的初始化

  指针变量在使用前必须要初始化,把一个具体的地址赋给它,否则引用时会有副作用,如果不指向任何数据就赋“空值”NULL。

  指针变量两种初始化

  方法二:int a=2,*p; (定义之后初始化)

  【考点4】指针变量的引用

  &是取地址符,*是间接访问运算符,它们是互逆的两个运算符。在指针变量名前加间接访问运算符就等价它所指向的量。

  【考点5】指针的`运算

  *p 可以当做变量来用;*的作用是取后面地址p 里面的数值

  p 是当作地址来使用。

  *p++ 和(*p)++的之间的差别:改错题目中很重要

  *p++是地址会变化。

  (*p)++ 是数值会要变化。

  三名主义:(考试的重点)

  数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次)

  函数名:表示该函数的入口地址。

  字符串常量名:表示第一个字符的地址。

  指针变量是存放地址的。并且指向哪个就等价哪个,所有出现*p 的地方都可以用它等价的代替指向的变量。

  (由于*p 指向变量a,所以指向哪个就等价哪个,这里*p 等价于a,可以相当于是a=a+2)

我要回帖

更多关于 c语言指针变量赋值 的文章

 

随机推荐