指针与指针变量的概念是什么?

指针与指针变量的概念是什么?,第1张

1、指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。

有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行 *** 作。

2、指针变量是指存放地址的变量。因地址的改变而做出指定性质的衡量变法。

扩展资料:

指针变量定义:

1、定义指针变量的一般形式如下:

类型名指针变量名1,指针变量名2, 指针变量名n ;

2、空指针

空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在stdioh中定义)表示这个空值,并保证这个值不会是任何变量的地址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指针值表示当前它没有指向任何有意义的东西。

3、void指针

(void )类型的指针叫通用指针,可以指向任何的变量,C语言允许直接把任何变量的地址作为指针赋给通用指针。

但是需要注意void不能指向由const修饰的变量,例如const int test; void ptv; ptv = &test;第三句是非法的,只有将ptv声明为const void ptv;,上述第三句ptv = &test才是合法的。

当需要使用通用指针所指的数据参加运算时,需要写出类型强制转换。如通用指针ptv 所指空间的数据是整型数据,p是整型指针,用此式转换:p=(int )ptv;

参考资料来源:百度百科-指针变量

参考资料来源:百度百科-指针

struct stu head,p,q;
这样定义时是没问题的,但看你下面的用法,你应该是想将P和q也定义成指针,这样讲的话这样的定义就是不正确的,应该用struct stu head,p,q;
struct stu head,p,q;这样定义只是定义了一个指针head和两个结构体变量p和q

1、概念不同

“指针”是概念,“指针变量”是具体实现,指针也是一个变量,所以需要进行定义,而对于指针的定义,与一般变量一样。

2、 存放地址不同

一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针)。

扩展资料:

指针和指针变量的关系

1、指针就是地址,地址就是指针。

2、地址就是内存单元的编号。

3、指针变量就是存放内存地址的变量。

4、指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。

注:

指针里存的是100 指针:地址 - 具体。

指针里存的是地址,指针:指针变量 -可变。

指针的好处:

1、直接访问硬件

2、快速传递数据(指针表示地址)

3、返回一个以上的值返回一个(数组或者结构体的指针)

4、表示复杂的数据结构(结构体)

5、方便处理字符串

6、指针有助于理解面向对象

在c语言中.指针被用来表示内存单元的地址,如果把这个地址用一个变量来保存,则
这种变量就称为指针变量。指针变量也分别有不同的类型,用来保存不同类型变量的地址。
严格地说.指针与指针变量是不同的,为了叙述方便,常常把指针变量就称为指针。
内存是计算机用于存储数据的存储器,以字节作为存储单元.为了能正确的访问内存单
元,必须为每一个内存单元编号,这个编号就称为该单元的地址。如果将一个旅店比喻成内
存,则旅店的房间就是内存单元,房间号码就是该单元的地址。
指针变量定义格式:
[存储类型]
数据类型
指针变量名[=初始值]
指针变量一旦定义,必须采用赋值的方式将其与某个变量实体相联系,才能使用。指针
变量的赋值方式:
指针变量名;&普通变量名;

#include <stdioh>
#include <malloch>
int main(void)
{
char s, t, ch;
int n = 0, i;
s = t = NULL;
ch = (char )malloc(sizeof(char));
while (scanf("%c", ch))
{
if (ch == 10)
break;
n ++;
t = s;
s = (char )malloc(sizeof(char) n);
if (t != NULL)
{
for (i = 0; i < n - 1; i ++)
s[i] = t[i];
free(t);
t = NULL;
}
s[n - 1] = ch;
}
puts(s);
free(ch);
free(s);
return 0;
}

在信息工程中,指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中的寄存器(Register)。指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象语言如Java一般避免用指针,而是引用。

1基本概念

指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。

在计算机语言中,由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

2指针实质

指针其实是一个整数

计算机中的内存都是编址的,每个地址都有一个符号,就像家庭地址或者IP地址一样。在C语言的多数实现中,指针值等同于一个无符号整数(unsigned int,因不致歧义,下简称“整数”),它是一个以当前系统寻址范围为取值范围的整数。声明一个无符号整数并使它的值等于对象的地址值,实质上也能使之有指针的作用。

32位系统的寻址能力(地址空间)是4GB(0~232-1),二进制表示长度为32比特,也就是4B。不难验证,在32位系统的大多数实现里,int类型也正好是4B(32-bit)长度,可以取遍上述范围。同理,64位系统取值范围为0~264-1,int类型长度为8B。

例证就是程序1得到的答案和程序2的答案一致。

程序1:#include main(){ char pT; char t='h'; pT=&t; putchar(pT);}

程序2:#include <stdioh>main(){ char pT; char t='h'; pT=(char )1245048; putchar(pT);}

3指针和整数的区别

既然指针的实质是一个整数,为何不用unsigned int直接声明,或者统一用int 声明,而要用不同的类型后面加上一个“”表示呢?char 声明过的类型,一次访问1个sizeof(char)长度,double 声明过的类型,一次访问1个sizeof(double)长度。也正因此,程序2第6行加上“(char )”是因为毕竟unsigned int和char 不是一回事,需要强制转换,否则会有个警告。

在汇编里,没有数据类型这一概念,整数类型和指针就是一回事了。不论是整数还是指针,执行自增的时候,都是将原值加1。如果上文声明char pT;,汇编语言中pT自增(INC)之后值为1245049,可是C语言中pT++之后pT值为1245049。如果32位系统中,上文声明int pT;,汇编语言中pT自增之后值为1245049,可是C语言中pT++之后pT值为1245052。

为什么DOS下面的Turbo C,和Windows下的VC的int类型自增时的步进不一样长?因为DOS是16位的,Windows x86是32位的,int类型长度取决于编译器的位长。可以预见,在Windows x64中编译,上文声明int pT;,在执行pT++之后pT值为1245056。

指针变量是有加减运算的,但是要注意以下几点:
1指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址。指针变量可以加减,但是只能与整型数据加减,此时加减的含义并不是其地址值进行了加减,也就是说如果指针变量p的值是0x20000000,那么p=p+2;的值并不是0x20000002,并不是地址值的简单相加,那么地址值加减多少是与指针指向的数据类型相关联的,如果在32位的 *** 作系统上,p是指向整型数据的指针变量,那么p=p+2之后,p的地址值变成0x20000008,也就说实际上地址值加了多少呢:sizeof(int)2这么多。说明白点,我们加减的数字是以指针指向的数据类型为量度的,p+2表示p在内存中前移两个int的距离,如果p不是int类型,而是其他类型道理也是一样。同样指针与整型数据相减也是同样的道理。
2指针之间可以相减,但不可以相加:两个同一类型的指针变量是可以相减的,他们的意义表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数),例如对于int类型的指针p和p1p1-p的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。指针变量的自加和自减实际上是与整数1的加减运算。
3指针之间可以比较大小。但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13182439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-17
下一篇 2023-06-17

发表评论

登录后才能评论

评论列表(0条)

保存