2024年9月c语言指针数组举例(论述C语言中指针的概念和作用,并举例说明)
⑴c语言指针数组举例(论述C语言中指针的概念和作用,并举例说明
⑵论述C语言中指针的概念和作用,并举例说明
⑶指针概念:变量的地址(计算机内存字节的编号叫做指针,存放变量地址的变量叫指针变量,简言之,指针是用来存放地址的。、作用:指向这个变量或数组的首地址,是变量的间接引用方式。其值如果改变,变量的值或数组元素的值也会跟着改变。程序对变量的操作实际上是对变量所在的存储空间读取和写入数据。方便对变量的操作。举例说明:inta=;/*定义一个整型变量a,并赋初值*/int*p;/*定义一个指针变量P*/p=&a/*让p指向a的首地址,也就是a的地址*/程序为a分配一个个字节的存储单元,假如个字节的地址分别为(ABCD和ABCD,唯一,那么p里面放的值就是ABCD,不是。这时可通过p直接引用a,实际上*p=。以后不管a存放在内存中的哪个地方,只用通过调用p就可以引用a。这时如果令*p=,则最后的a值也为。对于数组,指针是指向数组的首地址。
⑷C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’
⑸指针数组定义int*p;
⑹优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+时,则p指向下一个数组元素,
⑺这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p,而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。
⑻数组指针定义int(*p);
⑼()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+时,p要跨过n个整型数据的长度。
⑽如要将二维数组赋给一指针,应这样赋值:
⑾int(*p);//该语句是定义一个数组指针,指向含个元素的一维数组。
⑿p=a;//将该二维数组的首地址赋给p,也就是a
⒀p++;//该语句执行过后,也就是p=p+;p跨过行a
⒁数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于级指针,这个指针不可移动;指针数组是数组元素为指针的数组,其本质为数组。
⒂例如:*p,有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
⒃二维数组:如charstring_只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。
⒄指针数组:如char*str_B系统至少会分配个连续的空间用来存储个元素,表示str_B是一个个元素的数组,每个元素是一个指向字符型数据的一个指针。
⒅如果我做这样的定义:
⒆chara={“gain“,“much“,“strong“};
⒇char*n={“gain“,“much“,“strong“};
⒈他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
⒉×的空间,而给n分配的空间则取决于具体字符串的长度。
⒊此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
⒋由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
⒌#include《stdio.h》
⒍charc={“哥“,“哥“,“我“,“岸“,“上“,“走“};//UTF-:一个汉字=个字节
⒎inti;p=c;//将指针定位于c
⒏for(i=;i《=;i++)
⒐printf(“%s,“,*(p+i));//或者将*(p+i)替换成*p++
⒑for(i=;i》=;i--)
⒒printf(“%s,“,*(p+i));//或者将*(p+i)替换成*--p
⒓#include《stdio.h》
⒔char*pch={“妹“,“妹“,“你“,“坐“,“船“,“头“};
⒕for(i=;i《;i++){
⒖printf(“%s,“,pch《i》);
⒗for(i=;i》=;i--){
⒘printf(“%s
⒙“,pch《i》);
⒚百度百科——指针数组
⒛谁发点C语言例子给我,关于数组和指针的
下面是我收藏的关于指针的一个非常好的文档,讲的很深入,楼主要是感兴趣的话可以研究一下,要是有不懂得地方可以随时问我。。。第一章。指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。先声明几个指针放着做例子:例一:()int*ptr;()char*ptr;()int**ptr;()int(*ptr);()int*(*ptr);。指针的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:()int*ptr;//指针的类型是int*()char*ptr;//指针的类型是char*()int**ptr;//指针的类型是int**()int(*ptr)()int*(*ptr)怎么样?找出指针的类型的方法是不是很简单?。指针所指向的类型。当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:()int*ptr;//指针所指向的类型是int()char*ptr;//指针所指向的的类型是char()int**ptr;//指针所指向的的类型是int*()int(*ptr)()int*(*ptr)在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型“这个概念分成“指针的类型“和“指针所指向的类型“两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。。指针的值,或者叫指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在位程序里,所有类型的指针的值都是一个位整数,因为位程序里内存地址全都是位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?。指针本身所占据的内存区。指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在位平台里,指针本身占据了个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。第二章。指针的算术运算指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:例二:。chara;。int*ptr=a;......。ptr++;在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第句中,指针ptr被加了,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在位程序中,是被加上了。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了个字节。由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第号单元开始的四个字节,此时指向了数组a中从第号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组,看例子:例三:intarray;int*ptr=array;...//此处略去为整型数组赋值的代码。...for(i=;i《;i++){(*ptr)++;ptr++;}这个例子将整型数组中各个单元的值加。由于每次循环都将指针ptr加,所以每次循环都能访问数组的下一个单元。再看例子:例四:。chara;。int*ptr=a;......。ptr+=;在这个例子中,ptr被加上了,编译器是这样处理的:将指针ptr的值加上乘sizeof(int),在位程序中就是加上了乘=。由于地址的单位是字节,故现在的ptr所指向的地址比起加后的ptr所指向的地址来说,向高地址方向移动了个字节。在这个例子中,没加前的ptr指向数组a的第号单元开始的四个字节,加后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。如果上例中,ptr是被减去,那么处理过程大同小异,只不过ptr的值是被减去乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了个字节。总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。第三章。运算?amp;和*这里&是取地址运算符,*是...书上叫做“间接运算符“。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。例五:inta=;intb;int*p;int**ptr;p=&a//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。*p=;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=&p//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。*ptr=&b//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。**ptr=;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。第四章。指针表达式。一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子:例六:inta,b;intarray;int*pa;pa=&a//&a是一个指针表达式。int**ptr=&pa//&pa也是一个指针表达式。*ptr=&b//*ptr和&b都是指针表达式。pa=array;pa++;//这也是指针表达式。例七:char*arr;char**parr=arr;//如果把arr看作指针的话,arr也是指针表达式char*str;str=*parr;//*parr是指针表达式str=*(parr+);//*(parr+)是指针表达式str=*(parr+);//*(parr+)是指针表达式由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。第五章。数组和指针的关系如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;《如何理解c和c++的复杂类型声明》》。数组的数组名其实可以看作一个指针。看下例:例八:intarray=,value;......value=array;//也可写成:value=*array;value=array;//也可写成:value=*(array+);value=array;//也可写成:value=*(array+);上例中,一般而言数组名array代表数组本身,类型是int,但如果把array看做指针的话,它指向数组的第个单元,类型是int*,所指向的类型是数组单元的类型即int。因此*array等于就一点也不奇怪了。同理,array+是一个指向数组第个单元的指针,所以*(array+)等于。其它依此类推。例九:char*str={“Hello,thisisasample!“,“Hi,goodmorning.“,“Helloworld“};chars;strcpy(s,str);//也可写成strcpy(s,*str);strcpy(s,str);//也可写成strcpy(s,*(str+));strcpy(s,str);//也可写成strcpy(s,*(str+));上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第号单元,它的类型是char**,它指向的类型是char*。*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串“Hello,thisisasample!“的第一个字符的地址,即’H’的地址。str+也是一个指针,它指向数组的第号单元,它的类型是char**,它指向的类型是char*。*(str+)也是一个指针,它的类型是char*,它所指向的类型是char,它指向“Hi,goodmorning.“的第一个字符’H’,等等。下面总结一下数组的数组名的问题。声明了一个数组TYPEarray;第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第号单元,该指针自己占有单独的内存区,注意它和数组第号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。在不同的表达式中数组名array可以扮演不同的角色。在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第号单元的值。sizeof(*array)测出的是数组单元的大小。表达式array+n(其中n=,,,....。中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。例十:intarray;int(*ptr);ptr=&array上例中ptr是一个指针,它的类型是int(*),我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:int(*ptr);则在位程序中,有:sizeof(int(*))==sizeof(int)==sizeof(ptr)==实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。第六章。指针和结构类型的关系可以声明一个指向结构类型对象的指针。例十一:structMyStruct{inta;intb;intc;}MyStructss=;//声明了结构对象ss,并把ss的三个成员初始化为,和。MyStruct*ptr=&ss//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。int*pstr=(int*)&ss//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。请问怎样通过指针ptr来访问ss的三个成员变量?答案:ptr-》a;ptr-》b;ptr-》c;又请问怎样通过指针pstr来访问ss的三个成员变量?答案:*pstr;//访问了ss的成员a。*(pstr+);//访问了ss的成员b。*(pstr+)//访问了ss的成员c。呵呵,虽然我在我的MSVC++.上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:例十二:intarray=;int*pa=array;通过指针pa访问数组array的三个单元的方法是:*pa;//访问了第号单元*(pa+);//访问了第号单元*(pa+);//访问了第号单元从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干?quot;填充字节“,这就导致各个成员之间可能会有若干个字节的空隙。所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。第七章。指针和函数的关系可以把一个指针声明成为一个指向函数的指针。intfun(char*,int);int(*pfun)(char*,int);pfun=fun;........inta=(*pfun)(“abcdefg“,);//通过函数指针调用函数。可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。例十三:intfun(char*);inta;charstr=“abcdefghijklmn“;a=fun(str);......intfun(char*s){intnum=;for(inti=;i{num+=*s;s++;}returnnum;)这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加运算,并不意味着同时对str进行了自加运算。第八章。指针类型转换当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。例十四:。floatf=.;。float*fptr=&f。int*p;在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?p=&f不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++.上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行“强制类型转换“:p=(int*)&f如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*和TYPE,那么语法格式是:(TYPE*)p;这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。例十五:voidfun(char*);inta=,b;fun((char*)&a);......voidfun(char*s){charc;c=*(s+);*(s+)=*(s+);*(s+)=c;c=*(s+);*(s+)=*(s+);*(s+)=c;}}注意这是一个位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp,然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。我们已经知道,指针的值就是指针指向的地址,在位程序中,指针的值其实是一个位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:unsignedinta;TYPE*ptr;//TYPE是int,char或结构类型等等类型。......a=;ptr=;//我们的目的是要使指针ptr指向地址(十进制ptr=a;//我们的目的是要使指针ptr指向地址(十进制编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:unsignedinta;TYPE*ptr;//TYPE是int,char或结构类型等等类型。......a=某个数,这个数必须代表一个合法的地址;ptr=(TYPE*)a;//呵呵,这就可以了。严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:例十六:inta=,b;int*ptr=&achar*str;b=(int)ptr;//把指针ptr的值当作一个整数取出来。str=(char*)b;//把这个整数的值当作一个地址赋给指针str。好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。第九章。指针的安全问题看下面的例子:例十七:chars=’a’;int*ptr;ptr=(int*)&s*ptr=;指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。让我们再来看一例:例十八:。chara;。int*ptr=&a......。ptr++;。*ptr=;该例子完全可以通过编译,并能执行。但是看到没有?第句对指针ptr进行自加运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。而第句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。在指针的强制类型转换:ptr=(TYPE*)ptr中,如果sizeof(ptr的类型)大于sizeof(ptr的类型),那么在使用指针ptr来访问ptr所指向的存储区时是安全的。如果sizeof(ptr的类型)小于sizeof(ptr的类型),那么在使用指针ptr来访问ptr所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一想,应该会明白的。
这个可不是老师故意为难的,而是作为IT一员所必须理解的.对于编译器来说,““是个优先级很高的单目运算符,它是这样解析这运算符的:array=*(*(*(*(*(array+m))+m)+m)+m)+...+mn);(n》=)这里来讨论简单点的咯,就取n=时吧,此时有:array=*(*(array+m)+m);要透彻理解这表达式,得先弄清楚指针的加法是怎样的.指针p=指针q+n(n为整数,p,q为同类型指针),意思即:指针p指向了指针q所指向内存处的后n*q所指向的单位的大小.举个例子吧:intarray;array是个二维数组,由个一维数组array而(*array)(即array).所以,便有了array)个字节.所以,指针一共要移动多少也就清楚了.因为不知道你学得怎样,所以讲的有些啰嗦呃,但尽量清楚些....再举个典型例子:intarray={,,,,,,,,,,,};printf(“%d
“,array);这该输出多少呢?还是越界错误?解答:array,即,所以程序输出.也可以这样快速看出array了.所以输出.
int(*pstu);?为指向有个元素的数组的指针
int*getPosPerson(intpos,int(*pstu));?为返回值为指针的函数
注意这是指针函数,而不是函数指针,后者为指向函数的指针变量,两者含义是不同的
(类似指针数组和数组指针,两者含义也是不同的,一个本质是数组,一个本质是指针
调用该函数的语句为:ppos=?getPosPerson(pos,?scores);
传入的scores表示行列的二维数组首行数组的地址,即&scores
调用后相当于int(*pstu)=scores,所以在getPosPerson中pstu与scores是等价的
即pstu可看作&scores
即返回了指向&scores(也就是scores第pos+行的地址的指针
返回该行指针ppos?后,就可以查看该行表示的学生的科成绩了
C语言程序中怎么用指针代替数组谁能简单的举个例子说明一下
inta;int*p=&a//*(p+n)=a;inta;int*p;p=a;//注意只能是这种格式;此指针指向的是列地址。//*(p+)=a;int*p;p=a;//注意只能用这种格式,指向的是行地址。//*(*(p+i)+j)=a;
p是int类型指针,指向数组a的第个元素即一个一维的数组{,,}首地址所以p);输出。int**pp=pa是声明了一个指向pa的指针,而pa又是指向a首地址的int类型指针。pa指向的是a的第一维,pa);输出
C语言指针数组的使用
int?**a可以表达一个二维数组。为什么呢?
你可以这么理解?*?p;
实际上就是?访问*a+i;???*?这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int?*p?表示可以存三个int?类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。
我现在输出的是地址,是不是连续的?
用*运算符获取地址的内容。
实际上p与*(p+i是表达的是同一个意思。只不过只有数组可以定义一个连续的空间
(数组的第一个地址是随机的其他的是连续的。单独用指针的话会随机分配的
数组的指针可以存三个地址。当然可以访问二维数组了。
请教指针和数组的c语言经典例题
利用指代替下标进行数组编程:从健盘输入个整数放入数组,然后将每个奇数加,每个偶数减,最后输出数组的所有元素.程序如下:main(){inta,*p;/*定义变量和数组*/for(p=a;p《a+;p++)scanf(“%d“,p);/*输入*/for(p=a;p《a+;p++){if(*p%==)(*p)--;else(*p)++;}for(p=a;p《a+;p++)printf(“%d “,*p);/*一个个输出*/}其实指针和数组是一个东东,数组名就是一个指针,如果个这例子看不懂,再问!!!
首先说,这道题出的有问题。但是也只有A错的最明显Ap=a//a相当于二维指针,将它的值赋给一维指针p这是错误一,其次是数组赋值不能直接用等号,这是错误二。Bq虽然数据不正确,但是可以强制通过Cp=a的起始地址赋给一维指针pDq时,才可以用这样的赋值方式,这个连编译都不能通过。