2024年10月指针是什么意思(C语言中的指针是什么意思)

 更新时间:2024-10-12

  ⑴指针是什么意思(C语言中的指针是什么意思

  ⑵C语言中的指针是什么意思

  ⑶其实与其你在这里问,还不如看一看c语言教科书,上面写的都很详细以下是谭浩强版的在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占个单元,字符量占个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单,找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针,存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。这也是引入“指针”概念的一个重要原因。

  ⑷指针是C语言里面的一个重要概念,也是C语言的难点之一.指针可以表示许多复杂的数据结构,如队列,栈,链表,树,图等.要学习指针,应该先了解以下几个概念:变量的地址,变量的内容,直接寻址,间接寻址.变量的地址:变量在内存中所占存储空间的首地址.变量的内容:变量在内存的存储单元中存放的数据.如:inta=;//两个字节假设a占的内存单元的地址为:和则内存单元的地址为的是存放数据a(即)的低字节,内存单元的地址为的是存放数据a即)的高字节.如果将变量a的首地址保存到另一个变量p中,那么为了访问变量a,我们可以通过变量p得到a的的地址,再到该地址中访问变量a.直接寻址:直接按变量名来存取变量的内容的访问方式.专门用于存放地址型数据的变量是指针变量,如上面所说的p.间接寻址:通过指针变量(如P)间接存取它所指向的变量(如a)的访问方式称为间接寻址.在上例中,a的地址用&a表示.由于p是保存地址型数据的,所以p=a的地址=&a在此p就叫做指针(或指针变量)其定义如下:int*p;指针有好多好处:.为函数提供修改变量值的手段..为C的动态内存分配提供支持..为动态数据结构提供支持..可以改善程序的效率.

  ⑸在日常生活中指针是仪器或钟表上的,可动的,一般狭长的,往往在一段尖的用来指示测量的数据的装置。.在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函树的值。大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有c语言的指针才能算指针。basic不支持指针,在此不论。其实,pascal语言本身也是支持指针的。从最初的pascal发展至今的objectpascal,可以说在指针运用上,丝毫不会逊色于c语言的指针。以下内容分为八部分,分别是一、类型指针的定义二、无类型指针的定义三、指针的解除引用四、取地址(指针赋值五、指针运算六、动态内存分配七、字符数组的运算八、函数指针一、类型指针的定义。对于指向特定类型的指针,在c中是这样定义的:int*ptr;char*ptr;与之等价的objectpascal是如何定义的呢?varptr:^integer;ptr:^char;其实也就是符号的差别而已。二、无类型指针的定义。c中有void*类型,也就是可以指向任何类型数据的指针。objectpascal为其定义了一个专门的类型:pointer。于是,ptr:pointer;就与c中的void*ptr;等价了。三、指针的解除引用。要解除指针引用(即取出指针所指区域的值,c的语法是(*ptr),objectpascal则是ptr^。四、取地址(指针赋值。取某对象的地址并将其赋值给指针变量,c的语法是ptr=&objectobjectpascal则是ptr:=object;也只是符号的差别而已。五、指针运算。在c中,可以对指针进行移动的运算,如:chara;char*ptr=a;ptr++;ptr+=;当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a。ptr+=;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下objectpascal中如何实现:vara:arrayofchar;ptr:pchar;//pchar可以看作^charbeginptr:=a;inc(ptr);//这句等价于c的ptr++;inc(ptr,);//这句等价于c的ptr+=;end;只是,pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。六、动态内存分配。c中,使用malloc()库函数分配内存,free()函数释放内存。如这样的代码:int*ptr,*ptr;inti;ptr=(int*)malloc(sizeof(int)*);ptr=ptr;for(i=;i《;i++){*ptr=i;ptr++;}free(ptr);objectpascal中,动态分配内存的函数是getmem(),与之对应的释放函数为freemem()(传统pascal中获取内存的函数是new()和dispose(),但new()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块。因此,与上面那段c的代码等价的objectpascal的代码为:varptr,ptr:^integer;i:integer;begingetmem(ptr,sizeof(integer)*);//这句等价于c的ptr=(int*)malloc(sizeof(int)*);ptr:=ptr;//保留原始指针位置fori:=todobeginptr^:=i;inc(ptr);end;freemem(ptr);end;对于以上这个例子(无论是c版本的,还是objectpascal版本的,都要注意一个问题,就是分配内存的单位是字节(byte,因此在使用getmem时,其第二个参数如果想当然的写成,那么就会出问题了(内存访问越界。因为getmem(ptr,);实际只分配了个字节的内存空间,而一个整形的大小是四个字节,那么访问第五个之后的所有元素都是非法的了(对于malloc()的参数同样。七、字符数组的运算。c语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也有一套str打头的库函数以进行字符数组的运算,如以下代码:charstr;char*pstr;strcpy(str,“teststr“);strcat(str,“_testok“);pstr=(char*)malloc(sizeof(char)*);strcpy(pstr,str);printf(pstr);free(pstr);而在objectpascal中,有了string类型,因此可以很方便的对字符串进行各种运算。但是,有时我们的pascal代码需要与c的代码交互(比如:用objectpascal的代码调用c写的dll或者用objectpascal写的dll准备允许用c写客户端的代码的话,就不能使用string类型了,而必须使用两种语言通用的字符数组。其实,objectpascal提供了完全相似c的一整套字符数组的运算函数,以上那段代码的objectpascal版本是这样的:varstr:arrayofchar;pstr:pchar;//pchar也就是^charbeginstrcopy(str,’teststr’);//在c中,数组的名称可以直接作为数组首地址指针来用//但pascal不是这样的,因此str前要加上取地址的运算符strcat(str,’_testok’);getmem(pstr,sizeof(char)*);strcopy(pstr,str);write(pstr);freemem(pstr);end;八、函数指针。在动态调用dll中的函数时,就会用到函数指针。假设用c写的一段代码如下:typedefint(*pvfn)(int);//定义函数指针类型intmain(){hmodulehmodule=loadlibrary(“test.dll“);pvfnpvfn=null;pvfn=(pvfn)getprocaddress(hmodule,“function“);pvfn();freelibrary(hmodule);}就我个人感觉来说,c语言中定义函数指针类型的typedef代码的语法有些晦涩,而同样的代码在objectpascal中却非常易懂:typepvfn=function(para:integer):integer;varfn:pvfn;//也可以直接在此处定义,如:fn:function(para:integer):integer;hm:hmodule;beginhm:=loadlibrary(’test.dll’);fn:=getprocaddress(hm,’function’);fn();freelibrary(hm);end;

  ⑹在计算机科学中,指针(Pointer是编程语言中的一个对象,利用地址,它的值直接指向(pointsto存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

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

  ⑻另外,指针也指钟表中用来指示对应时间的部件。

  ⑼指针的机制比较简单,其功能可以被集中重新实现成更抽象化的引用(reference数据形别。许多编程语言中都支持某种形式的指针,最著名的是C语言,但是有些编程语言对指针的运用采取比较严格的限制,如Java一般避免用指针,改为使用引用。

  ⑽有两种含义,一是作为数据类型,二是作为实体。

  ⑾指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。指针一般出现在比较底层的程序设计语言中,如C语言。高层的语言如Java一般避免用指针,而是引用。

  ⑿指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出。从中导出的数据类型称之为被引用类型(referencedtype。指针类型描述了一种对象,其值为对被引用类型的实体的引用。

  ⒀参考资料:百度百科-指针

  ⒁C语言里面指针到底是什么意思

  ⒂指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址,比如说inta;int*p=&a这里面,a是普通的整形变量,p则是指针,用来存储变量a的地址,这样做的话,就可以很容易的找到变量a所在的位置,从而得到a的值

  ⒃简单点说,就是内存地址。比如,一组数据,,,,,;按照一定顺序存入计算机的内存,每一个数都对应一个地址。计算机内部的操作就是到一个变量所对应的地址去取数。

  ⒄c语言指针是什么意思!

  ⒅指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址。指针(Pointer是编程语言中的一个对象,利用地址,它的值直接指向(pointsto存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。

  ⒆因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

  ⒇再打个比方:有个人让你去麦当劳帮我买个雪糕,那么麦当劳是这个变量a,但是那个人现在把麦当劳所在的地址写在纸上给你,那么这张纸就可以看做一个指向麦当劳的指针。

  ⒈intp;//这是一个普通的整型变量。

  ⒉int*p;//首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针。

  ⒊intp结合,说明P是一个数组,然后与int结合,说明数组里的元素是整型的,所以P是一个由整型数据组成的数组。

  ⒋int*p结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int结合,说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组。

  ⒌int(*p)结合(与“()“这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针。

  ⒍int**p;//首先从P开始,先与*结合,说是P是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int结合,说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型就不考虑多级指针了,最多只考虑一级指针。

  ⒎intp(int);//从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int结合,说明函数的返回值是一个整型数据。

  ⒏Int(*p)(int);//从P处开始,先与指针结合,说明P是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int结合,说明函数有一个int型的参数,再与最外层的int结合,说明函数的返回类型是整型。

  ⒐所以P是一个指向有一个整型参数且返回类型为整型的函数的指针。

  ⒑int*(*p(int));//可以先跳过,不看这个类型,过于复杂从P开始,先与()结合,说明P是一个函数,然后进入()里面,与int结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针。

  ⒒然后到最外面一层,先与结合,说明返回的指针指向的是一个数组。然后再与*结合,说明数组里的元素是指针,然后再与int结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

  ⒓意思是一个char指针。

  ⒔在计算机科学中,指针(Pointer是编程语言中的一个对象,利用地址,它的值直接指向(pointsto存在电脑存储器中另一个地方的值。

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

  ⒖大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。

  ⒗同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。basic不支持指针,在此不论。其实,pascal语言本身也是支持指针的。

  ⒘从最初的pascal发展至今的objectpascal,可以说在指针运用上,丝毫不会逊色于c语言的指针。

  ⒙计算机中的内存都是编址的,就像你家的地址一样。在程序编译或者运行的时候,系统(可以不关心具体是什么,可能是编译器,也可能是操作系统开辟了一张表。

  ⒚每遇到一次声明语句(包括函数的传入参数的声明都会开辟一个内存空间,并在表中增加一行纪录。

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

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

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

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

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

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

  程序:#includemain(){char*pT;chart=’h’;pT=&t;putchar(*pT);}

  程序:#include《stdio.h》main(){char*pT;chart=’h’;pT=(char*);putchar(*pT);}

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

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

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

您可能感兴趣的文章:

相关文章