学通C语言367中c语言指针变量量p所指

以下试题来自:
单项选择题若有定义:int *p[3];则以下叙述中正确的是(
A) 定义了一个基类型为int的指针变量p,该变量具有三个指针
B) 定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C) 定义了一个名为*p的整型数组,该数组含有三个int类型元素
D) 定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
为您推荐的考试题库
你可能感兴趣的试题
热门相关试卷
最新相关试卷C语言指针**p是什么意思_百度知道
C语言指针**p是什么意思
int **解释:int *p;则p是一个指向int型的变量的地址, p是地址;
*p指的是内容而int **p;p指的是一个地址,p放的是*p的地址, *p指的是存放int 的地址.
其他类似问题
40人觉得有用
为您推荐:
提问者采纳
&#47,sizeof(对象)测出的都是对象自身的类型的大小,在实参和形参的结合过程中;&#47。看下例,指针的类型和指针表达式的类型是一样的,所以看起书来前后矛盾;Hi。也许这三个字节里存储了非常重要的数据。 数组的数组名其实可以看作一个指针。下面的例子演示了把一个指针的值当作一个整数取出来;value=array[4],如果sizeof(ptr2的类型)大于sizeof(ptr1的类型)。例如。.,因此这个表达式的结果就是数组第0号单元的值,就是说;*p=*b+c.;//*ptr和&b都是指针表达式,指针所指向的类型是a的类型.3。由于每次循环都将指针ptr加1,编译器是这样处理的。例五,arr也是指针表达式char *str,它的类型是char**;通过指针pa访问数组array的三个单元的方法是。结合这个例子;&/&#47,也可以把一个整数值当作地址赋给一个指针,这个东西有这些特点。第七章,指针所指向的类型有很大的作用,我们用整个数组的首地址来初始化它;//在上例中,我们需要把它的类型和所指向的类型改为TYEP*和TYPE:value=*指针所指向的的类型是 int *(4)int (*ptr)[3];}注意这是一个32位程序,它指向数组第n号单元;&#47.;;把这个整数的值当作一个地址赋给指针&#47。函数fun的作用是把一个整数的四个字节的顺序来个颠倒?我们的目的是要使指针ptr指向地址(十进制)ptr=a,还把和s相临的高地址方向的三个字节也改变了,你只要把指针声明语句里的指针名字去掉;i++){(*ptr)++。数组和指针的关系如果对声明数组的语句不太明白的话。*(pstr+2)&#47。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待.。在表达式sizeof(array)中,可以把指针的值当作一个整数取出来:例六,也会发生指针类型的转换;&a的结果是一个指针。形参这个指针的类型是char*。第五章;printf(&quot,可能会需要字对齐或双字对齐或者是别的什么对齐。*ptr=&b。从语法上看。,在某种编译环境下,它的类型是char*,请参阅我前段时间贴出的文章 &//&p的结果是个指针;这也是指针表达式,&quot。
第六章;3。但是看到没有.,则数组名称array就有了两重含义;&#47。在这个例子中,这就导致各个成员之间可能会有若干个字节的空隙,因为32位程序里内存地址全都是32位长,虽然我在我的MSVC++6。接下来的第3句中,直接赋值的方法是不行的:int array[10]=。指针所指向的类型;:int array[10];&#47:1。我看了不少书;如果看不懂后几个例子的话;}另外。1,所有类型的指针的值都是一个32位整数,没加5前的ptr指向数组a的第0号单元开始的四个字节,既然pa已经在内存中有了自己的位置;&#47。那可不可以把一个整数当作指针的值直接赋给指针呢,但由于指针还未初始化,str[2]).a=;int b,假如我们想让指针p指向实数f。*p的运算结果就五花八门了:char s[80]。 指针的值;a的结果是一个指针?答案是前者;&#47。 int *ptr=a,就把指针的这两个概念搅在一起了。 指针的类型:(1)int *ptr。当你通过指针来访问指针所指向的内存区时.,*p就是变量a。把指针数组名str当作一个指针的话;a=fun(str),否则也会造成类似的错误,且这两个指针的类型和所指向的类型是一样的;abcdefg&quot,这个值将被编译器当作一个地址。MyStruct *ptr=&ss,而不是一个一般的数值,7);b来给*ptr赋值就是毫无问题的了。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型);for(int i=0,即'*ptr的结果是ptr所指向的东西;&#47。指针所指向的内存区和指针所指向的类型是两个完全不同的概念,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念。 指针本身所占据的内存区。由于地址的单位是字节;*(parr+1)是指针表达式str=*(parr+2),它的类型是TYPE*。例十五,剩下的就是指针所指向的类型,所以* (array+3)等于3:s的类型是char*;&#47。一个函数如果使用了指针作为形参。例七.3:例十二;&#47,所以它所指向的内存区是不存在的..,它指向的地址就是原指针指向的地址;这样强制类型转换的结果是一个新指针,指针的值其实是一个32位整数!这会造成崩溃性的错误,越看越糊涂;int *c,也许这三个字节里正好是程序的一条代码;&#47:p=(int*)&f,指向的地址是a的地址;&#47,str是一个三单元的数组:例二,否则的话.,2;&#47。因此*array等于0就一点也不奇怪了;也可写成strcpy(s;int (*ptr)[10];:char s=&#39.,即类似array++的表达式是错误的;int *ptr,因为它还没有占据明确的内存:例十六。*str也是一个指针。以后,我们必须进行一次从int*类型到char*类型的转换,它指向的类型是MyS上例中,&b的结果也是个指针.书上叫做“间接运算符”。*p=24,这个指针表达式就是一个左值,该指针自己占有单独的内存区,并不意味着同时对str进行了自加1运算;(1)%d%d%dn&quot:char *arr[20]?p=&f,向高地址方向移动了20个字节。至少在我的MSVC++6,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话;(3)int **ptr,那么语法格式是,并把ss的三个成员初始化为20,*str)..value=array[0],它的类型是char*;访问了ss的成员c,它指向的类型是char。当你对C越来越熟悉时,str[1]),这个数必须代表一个合法的地址;/*ptr=1298;ptr=&array,结果是一个新的指针printf(&&#47,其它的编译器上我没试过?是用下面的语句吗,它的类型是int *。 int *ptr=&a。指针的算术运算指针可以加上或减去一个整数,类型是int *,所指向的类型也一致;此处略去为整型数组赋值的代码;通过函数指针调用函数。运算符&和*这里&是取地址运算符。第九章;&#47。例九,在这里是int**。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节:它的类型是p指向的类型,其实*ptr就是指针 pa,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小,它指向的类型是char。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,有。让我们看看例一中各个指针的类型:int array[3]=,指针所指向的地址嘛,c=3。注意到了吗;int a。int fun1(char*;}return num?不; /&#47,赋值号的右边是一个指针表达式.。例十四。好了:(1)int *ptr。上面强调了a的值必须代表一个合法的地址,它指向的类型是int,数组的名字也是一个指针,该新指针的类型是TYPE*;ptr=(int*)&s?4,str[0]);我们的目的是要使指针ptr指向地址(十进制)编译一下吧:&#47:int (*ptr)[10]?amp。 int *ptr=a; &#47。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念;:value=*(array+4);char str[]=&指针所指向的类型是int(2)char *ptr,那么我来问一问,每遇到一个指针.。)中.;&a是一个指针表达式。 在例七中。声明了一个数组TYPE array[n],但是str和s各自占用各自的存储空间。这是指针本身所具有的类型!&quot.h&访问了ss的成员a,对这个指针再做一次*运算:这个指针的类型是什么;(4)int (*ptr)[3],剩下的部分就是这个指针的类型,它被初始化为指向整形变量a,因为*ptr这个指针已经占据了内存.;/&#47,加5后.,大家可以试试。可以把指针作为函数的形参。在函数调用中.;指针所指向的的类型是 int *()[4]在指针的算术运算中;也可写成strcpy(s;把指针ptr的值当作一个整数取出来,*(str+2))。以后;/fun((char*)&a)。而原来的指针p的一切属性都没有被修改,就会出现非法操作错误;&#47,它指向数组的第0个单元:也可写成;&#47?就象下面的语句..,在32位程序中;指针的类型是int *(2)char *&#47.;}。例如?第3句对指针ptr进行自加1运算后:int a=123;,我们说一个指针的值是XX:value=*(array+3):编译器先构造一个临时指针 char*如果把arr看作指针的话;a=*p-c.void fun(char*s){&#47,实际是把str的值传递给了s;int *ptr=&a,所以;}MyStruct ss=;我们说一个指针指向了某块内存区域。为了实现我们的目的:sizeof(int(*)[10])==4sizeof(int [10])==40sizeof(ptr)==4实际上。*(str+1)也是一个指针,.,指针所指向的类型;Hello。从语法的角度看,应该怎么搞;ptr-&&#47.。 ptr++。一个表达式的最后结果如果是一个指针;&#47,它是一个指针;*ptr是个指针,ptrnew所指向的类型和ptrold所指向的类型也相同;&#47,array代表数组本身,这三个字节的值被改变了;;指针所指向的的类型是char(3)int **ptr。完全可以,它指向的地址就是a的首地址。它指向的地址就是s的首地址.,数组名array代表数组本身;指针的类型是char *(3)int **ptr。第八章,而不是别的什么类型的大小,array扮演的是指针。指针和函数的关系
可以把一个指针声明成为一个指向函数的指针:我的指针究竟指向了哪里;&#47,b=2,绝大多数情况下;&#47。例十三。让我们再来看一例;/ptr=。sizeof(*array)测出的是数组单元的大小;,类型是int [10];ptr-&gt。有可能它是一个非常重要的数据;上例中.3;p=&b,int *b){int c=4;ptr++.,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待.0上;/int (*pfun1)(char*。指针的安全问题看下面的例子;*p的结果;ptr=(TYPE*)a;&#47.,单元和单元之间没有空隙;该例子完全可以通过编译;&#47,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉。在32位程序中.,它指向的类型是int.;2,int类型占四个字节,把指针指向的地址即指针的值当作一个整数取出来; &#47.。而第4句竟然往这片存储区里写入一个数据.int a=(*pfun1)(&访问了第0号单元*(pa+1),那么在函数调用语句的实参和形参的结合过程中?你只要用函数sizeof(指针的类型)测一下就知道了,在例十二中.;&#47,TYPE是int,一般而言数组名array代表数组本身;}这个例子将整型数组中各个单元的值加1,看例子;char **parr=arr。表达式&f的结果是一个指针,指针指向的内存区。 ptr+=5,ptrnew的类型和ptrold的类型相同,该指针的类型是TYPE*,b,可以用指针表达式来作为实参,但是要知道;如果有一个指针p.。在我们前面所举的例子中。在语句ptr=&array中;&#47。好了;&#47,是被加上了4。 char a[20];pa++,它指向的类型是的第一个字符&#39,good morning。*(pstr+1);(2)char *ptr。在函数调用语句中?答案,它指向的类型是TYPE.for(i=0。那么我们的目的就不能达到了吗,指针的类型是float*.;/ &#47,&b).,嘿;&#47,所指向的类型是数组单元的类型即int.。总结一下;指针的类型是 int(*)[3](5)int *(*ptr)[4],编译器是这样处理的;第二。我们可以用一个指针和一个循环来遍历一个数组。3。该指针所指向的类型是p的类型,故int类型占了四个字节;&#47。所有的C/}pp(int a。但在存放结构对象的各个成员时;声明了一个指向结构对象ss的指针.,所以指针表达式也具有指针所具有的四个要素,在32位程序中就是加上了5乘4=20;&pa也是一个指针表达式;*(s+1)=c.;b。请写出以下程序的运行结果。因为成员a和成员b之间可能会有若干填充字节,也不能保证*(pstr+1)就一定能访问到结构成员b,应该会明白的;又请问怎样通过指针pstr来访问ss的三个成员变量。本节中提到了函数sizeof().;strcpy(s;,int),那就是a的地址,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,它指向数组的第1号单元,指针所指向的类型已经有了; &#47,那么*ptr当然也有了自己的位置;/&#47:char *str[3]={&quot,指针ptr的类型是int*,ptr是被减去5。通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法,它指向的类型是char *;C++编译器在排列数组的单元时,所以每次循环都能访问数组的下一个单元。指针所指向的内存区就是从指针的值所代表的那个内存地址开始;&指针的类型是 int *(*)[4]怎么样,都应该问问。故sizeof(array+n)测出的是指针类型的大小;*(parr+2)是指针表达式由于指针表达式的结果是一个指针。它的类型是MyStruct*:例四。 char a[20]。但是它的类型和它指向的类型和ptr是不同的;如何理解c和c++的复杂类型声明&a。虽然这种情况在应用上会出问题,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节;abcdefghijklmn&quot,array扮演的是指针;TYPE是int,也就是数组单元的类型,这倒是个不错的方法。这也体现出了指针的灵活性,但在语法上却是可以的。要是你的目的就是想看看各个结构成员之间到底有没有填充字节。该指针的值是不能修改的;&#47:*pa.,它的类型是TYPE [n].。&a的运算结果是一个指针,结果就是一个int类型的变量,b。str=(char*)b;/int array[10]。所以最后的结果是:(TYPE*)p;2:1;&#47。表达式array+n(其中n=0,*p):#include &lt,它所指向的类型是char,它指向的类型是char *; &lt。指针本身占了多大的内存。两者不一致?只有编译程序知道,为了说明为什么不正规;char *str.int fun(char*s){int num=0;&#47,a;H&#39?答案.;。int **ptr=&pa?在函数调用语句中;/&#47。 float f=12:ptr-&gt,你会发现:将指针ptr的值加上5乘sizeof(int),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的;/&#47,发现有些写得差的书中,&strcpy(s。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用;的地址,注意它和数组第0号单元占据的内存区是不同的,结果是一个新的指针ptrnew;;c=*(s+2)。呵呵。
第二章。*ptr是一个左值;*parr是指针表达式str=*(parr+1);指针所指向的的类型是 int()[3](5)int *(*ptr)[4],它的类型是int (*)[10];int a=125,赋值号的左边是一个指针;Hello。,一个指针ptrold加上一个整数n后?找出指针的类型的方法是不是很简单,指针所指向的类型和指针表达式所指向的类型是一样的。由于地址是用字节做单位的。同理.&也可写成,原来ptr是指向数组a的第0号单元开始的四个字节;*(s+3)=*(s+0),那么处理过程大同小异。例十;不对;/c=*(s+3);访问了第2号单元从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样,&a不是一个左值;&#47。前面说了,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘 sizeof(ptrold所指向的类型)个字节,需要进行“强制类型转换”;20;int *pa=;str=*parr.?指针指向的类型是什么。在不同的表达式中数组名array可以扮演不同的角色!这是严重的错误;value=array[3];2;H&#39?该指针指向了哪里。想想能不能反过来..0上调式过上述代码,int),char或结构类型等等类型.;&#47。总之*p的结果是p所指向的东西; &#47。指针的值是指针本身存储的数值。**ptr=34,然后执行temp=(char*)&a;&#47,否则就不是一个左值。int *pstr=(int*)&ss,请参阅我前段时间贴出的文章 &TYPE *ptr,它指向的类型是int **pp(a+c; &#47,该指针指向的类型是TYPE。指针表达式;声明了结构对象ss。如果上例中,在这里它的类型是int,还有办法.,类型是int*,指针的类型是a的类型加个*.,指针的值就是指针指向的地址,指针自身占据的内存;则在32位程序中。该指针所指向的地址就是指针p自己的地址;}这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。在函数体内对s进行自加1运算;&#47:1:void fun(char*),它的类型是char**;pp(int a,ptrnew的类型和ptrold的类型相同:int a=12,长度为sizeof(指针所指向的类型)的一片内存区。我们已经知道。ptr=&p,当把str作为实参传递给形参s后;main(){int a=1.:例八,1.;&#47?2..a=某个数;&#47,是精通指针的关键点之一。要搞清一个指针需要搞清指针的四方面的内容:int array[20]:*&#47,显然;/Hi;访问了ss的成员b.;&#47,程序员心里必须非常清楚,指针本身占据了4个字节的长度,并能执行。下面是一些指针表达式的例子;&#47,只不过ptr的值是被减去5乘sizeof(int),最后再把temp的值传递给s。在32位程序里,指向的类型是int,在这里是一个指针;p=&a.,就相当于说该指针指向了以XX为首地址的一片内存区域; &#47,在32位程序中,但如果把array看做指针的话,我们可以这样来想象编译器进行转换的过程;&#47:指针的类型。这也证明了指针的灵活性。*ptr=&b,该数组的每个单元都是一个指针,还有指针本身所占据的内存区。就是说:指针的类型。指针和结构类型的关系可以声明一个指向结构类型对象的指针.;*(s+2)=*(s+1)。所以;,此时指向了数组a中从第4号单元开始的四个字节,int *b)。所以在使用指针时。例如,故这时sizeof函数测出的是整个数组的大小,ptrnew所指向的类型和ptrold所指向的类型也相同。其它依此类推;int *p;i &lt,*p);&#47,ptr指向了和整形变量a相邻的高地址方向的一块存储区。再看例子,它指向的地址是字符串&quot,对指针的赋值语句要求赋值号两边的类型一致.&#47,而由于你对指针的马虎应用。在指针的强制类型转换,该指针指向的内存区就是数组第0号单元;声明了一个指向结构对象ss的指针;&#47,char类型占一个字节;指针的类型是 int **(4)int (*ptr)[3];也可写成strcpy(s,在你使用ptr的时候,它指向&quot,*(str+1))。严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样;呵呵。例十一;(5)int *(*ptr)[4],需要在相邻两个成员之间加若干个“填充字节”。第三章,指针ptr被加了1。在表达式*array中,array+3是一个指向数组第3个单元的指针,读者结合例十七来想一想,它指向的类型是TYPE,指针的值或者叫指针所指向的内存区;&#47,也要注意不要超出数组的低端和高端界限。 float *fptr=&f;在这个例子中;。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节;i++){num+=*s:1:它把指针ptr的值加上了sizeof(int).,30和40。在32位平台里;2,它指向数组的第0号单元.,这样使用pstr来访问结构成员是不正规的;上例中ptr是一个指针.;,this is a sample.&quot。至于为什么,等等,新的ptr指向的地址将比原来的 ptr所指向的地址向低地址方向移动了20个字节,说不定*(pstr+1)就正好访问到了这些填充字节呢,那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的;/pa=&a;;i &lt.;//&#47,或者说是无意义的;s++,它所占用的地址是p所指向的地址。因为指针p的类型是int*。 str+1也是一个指针,ptr已经指向了数组a的合法范围之外了。指针类型转换当我们初始化一个指针或给一个指针赋值时;也可写成。在例一中;TYPE *ptr,现在我们已经知道了,*是;a&#39,它所指向的类型是char,a。下面总结一下数组的数组名的问题.。在用指针访问数组的时候,或者叫指针所指向的内存区或地址,这些指针各指向一个字符串,甚至可能是一条代码,*b;;b=(int)ptr,b:例十八:例一:第一。。最后一条语句不但改变了s所占的一个字节,即使*pstr访问到了结构对象ss的第一个成员变量a;(2)%d%d%dn&quot,就相当于说该指针的值是这块内存区域的首地址,该指针的类型是p的类型加个*,它指向的类型是 float。 *ptr=115,让我们看看怎样通过指针来访问数组的各个单元,指针所指向的类型.;&#47。结果发现后面两条语句全是错的;int *ptr=array,它所占用的地址是p所指向的地址,然后再把这个整数当作一个地址赋给一个指针;如何理解c和c++的复杂类型声明&gt,他指向的类型是int [10],实;4;Hello world&quot.;strlen(s):例三:int fun(char*);访问了第1号单元*(pa+2)。由于char类型的长度是一个字节。第四章!&quot,b,value,this is a sample;指针ptr是一个int*类型的指针,s占一个字节,而写程序的人是不太可能知道的,char或结构类型等等类型;stdio。请问怎样通过指针ptr来访问ss的三个成员变量;*(s+0)=c:例十七,s所指向的地址就和str所指向的地址一致:ptr1=(TYPE*)ptr2中;的第一个字符的地址,这就可以了,总是把各个数组单元存放在连续的存储区里,它代表整个数组,这里是int*:struct MyStruct{int a。这块存储区里是什么;在上面的例子中。 int *p。一个指针ptrold减去一个整数n后;;strcpy(s;int *p.3; &lt:(1)int *pfun1=fun1?我们不知道;int b。让我们分别说明;&#47,故array+n的结果是一个指针。这样。先声明几个指针放着做例子,那么这个表达式就叫指针表达式; &#47,所以,ptr被加上了5。 ptr++;&#47它里面存储的数值被解释成为内存里的一个地址;&#47。这三个字节是干什么的; &#47。pa=array,站长团上有产品团购
其他3条回答
char **p表示p的类型是字符指针的指针char p表示p的类型是字符,指向字符指针的变量,指向字符类型的变量。char *p表示p的类型是字符指针
c = 'a'char
*pc = & ------& *pc = 'c'char
-----& **ppc = 'c'
表示这是一个二级指针
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言中,p是指针变量。p-&n++, ++(*p).n, ++p-&n 有什么区别????_百度知道
C语言中,p是指针变量。p-&n++, ++(*p).n, ++p-&n 有什么区别????
}n是结构体的成员
即访问下一个结构体变量的n成员;++(*p);++p-&gt,访问p所指结构体变量的n成员.n;n,先将p指针加一,然后将n加一,然后再访问n,先将p所指结构体变量的n成员加一;n++p-&gt
其他类似问题
为您推荐:
指针变量的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁以下试题来自:
单项选择题现有以下结构体说明和变量定义,如图所示,指针P、q、r分别指向一个链表中连续的三个结点。
struct node
{char data;
struct node*next;}*P,*q,*r;
现要将q和r所指结点交换前后位置,同时要保持链表的连续,以下不能完成此操作的语句是【
A.q->next=r->next;p->next=r;r->next:q;B.P->next=r;q->next=r->next;r->next=q;C.q->next=r->next;r->next=q;P->next=r;D.r->next=q;p->next=r;q->next=r->next;
为您推荐的考试题库
你可能感兴趣的试题
1A.voidB.intC.floatD.double2A.s=1.0;B.for(n=10;n>1;n--)C.s=s+1/n;D.printf("%6.4f\n",s);3A.10,01B.002,12C.102,10D.02,104A.数据共享问题B.数据安全问题C.大量数据存储问题D.简化数据维护5A.B.C.256 400D.400 400
热门相关试卷
最新相关试卷}

我要回帖

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

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信