为什么指向数组的指针本身和取值后是一样的? 指向数组的指针。 为什么不同电脑上的结果不一样。

作者&投稿:兆昆纯 (若有异议请与网页底部的电邮联系)
*pt是 int *类型的变量,也就是说整形指针。
而pt是 int(*)[3]类型的,printf方法取的是指针的首地址开始到结束位置的内容。
所以无论你用pt 还是*pt都是一样的。
但是实际上pt和*pt却不是一样儿的。
你可以随便弄个指针,你在printf试试,输出的肯定是指针所指数据的值,而不是指针本身的地址的值。
pt指向的是数组的第一位,并且长度是数组的长度X指针类型的长度,也就是说pt的内容是整个数组。
*pt指向的是数组中的第一个整数,其长度是一个整数的长度,也就是*pt的内容就只是第一个元素的值。
你自己可以debug一下就知道了。我刚试过。

是一样的,你定义的是一个指针数组,pt就是一个二维数组的指针,pt是第一行的行地址指向第一行的第一个元素,即元素1,而*pt是一个元素指针,指向的是第一行的第一个元素,也就是元素1
;你输出他们的时候都是元素1的地址,所以是一样的啊。

看错题目了,尴尬
对于数组指针,pt其实就是arr的首地址,*pt也是arr的首地址,是一样的
如果不是数组指针,那是不一样的。

你输出的方式不对吧,*pt[0]这样输出
本来不想回那么多,看到那么多回答真是误人子弟
什么指针数组,整形指针都扯出来,
int(*pt)[3]这样定义是数组指针的定义!

这样就说明了一个指向包含有3个元素的整形数组的数组指针

就是说pt是一个指针,而它指向的对象是一个指针,

这题里面就相当于指针的指针
你说不一样是因为你输出方式错误
可以这样输出*pt[0],*(pt[0]+1),*(pt[0]+2)
也可以用指针的指针输出**pt,*(*pt+1),*(*pt+2)

要搞明白数组指针的含义 这里*pt指向的是数组首地址的地址, 这里*pt==arr, pt==&arr,而对于数组arr[]而言,arr就是数组的首地址,即arr==&arr,所以*pt==pt.

数组指针(也称行指针)
定义
int
(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int
a[3][4];
int
(*p)[4];
//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义
int
*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样
*p=a;
这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int
*p[3];
int
a[3][4];
p++;
//该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int
*p[3]
表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
优先级:()>[]>*

如果指向数组的指针,超出了数组的范围,再对其取值得到的是一个随机数值吗?~

不是随机的,但是可以说是不可预料的。它一般而言是指向栈区中的废弃内存单元(没有被系统回收的内存)所存放的数据。还有,我们编写的C语言其实是运行在保护模式下的,所以你不要担心会整坏操作系统,因为有那样的错误,马上就会编译出来,或者运行时强制终止。但是一般我建议你不要做这种操作,因为C语言的编译标准不统一,难保特殊情况下不出现错误。

这个NEW 每次会强制分配,新空间,我举个例子,String a = new string("abc");String b = new string("abc");即使这样a!=b,因为当你new是系统会你新开辟你一个空间,每次运行都是不一样的。
你是用什么编译工具编译的;我觉得是不是说反了
我给你分析下,只有在new_out [i],取值才是有有效的,new_out [i-100] 【】中的i-100就是无效的i=0时 等于-100这就是无效的,结果当然是无效的。

c++指针数组和数组指针
答:数组指针,用楼上的话就是指向数组的指针,操作指针就可以操作数组如下:int a[3] = {1,2,3};int *p = a;printf("数组指针:%d\n", *(p+1));// 打印的结果为2,原因是p初始化指向了数组a的首地址,即a[0]。*(p+1)即先将地址向后挪动一位即指向了a[1],再取地址里面的值,即...

c 牛人请进
答:/*想用p++的方式 *p 是指向数组的指针 用p++来取值和换值 但是没有掌握 想办法搞定 还有sizeof 的用法*/ / (1)include<stdio.h> include<malloc.h> void main(){ int *p=(int*)malloc(10*sizeof(int));printf("input ten element:\n");for(int i=0;i<10;i++)scanf("%d",&p...

数组指针定义
答:首先,应该明白:int *p=a;相当于int *p;p=a;a也是地址,是数组的首地址,不过a是个常量,是不能变的!!p是指针,保存的是地址;*p是指定地址所在单元的值,在这里就是数组元素。p 变化了,就是指向了不同的元素,*p变了,所指的元素没有变,是元素的值变了。

指针呀~~~数组里的指针~~
答:p表示p是指向一整型元素的指针变量,p=a[0];表示p指向a的第0行第0列元素的地址 (*q)[3] 表示q是一个指针变量,它指向包含3个整型元素的一维数组 (*q)[3]=a;表示p指向a第1行的首地址,程序中q+i是二维数组a的第i行地址(由于q是指向一维数组的指针变量,因此q加1,就是指向下一个一维...

指针数组和数组指针的区别
答:在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。数组指针,指的是数组名的指针,即数组首元素地址的指针,即是指向数组的指针。指针数组可以作为...

求助一个关于C语言的基础知识,指针的
答:由于a代表了数组,所以&a的类型是char * (*)[3]型。这种类型是指向数组的指针,指向的数组中应该有3个元素,每个元素又是char *型。至于char * p = a+1; 和 char p; p=a+1;等号左右两边类型肯定不匹配,编译时会有警告。也许你是写错了。也许你说的a,是字符数组,而非字符串的数组...

在c++指针方面的知识里, P= ﹠a和﹡P= ﹠a有什么区别,分别代表什么含义...
答:(3)int **ptr; //指针所指向的的类型是 int * (4)int (*ptr)[3]; //指针所指向的的类型是 int()[3] (5)int *(*ptr)[4]; //指针所指向的的类型是 int *()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C...

什么指针数组,二维数组指针,搞得头晕
答:p2=p;这是给p2赋值,使得p2[0]指向{1,2,3} 1的地址,p2[1]指向{4,5,6} 4的地址,p2[2]指向{7,8,9} 7的地址 (*(p1+i)+1)+1 当i=1,*(p1+1)实际就是p1[1]指向4的地址,*(p1+i)+1指向4的地址下一个地址,即是5,那么对地址进行 就是取值,所以*(*(p1+i)+1)=5,...

C语言数组与指针
答:楼主你好。楼上几位说的基本都正确,但是我想说具体一点。注意a是常量,不要被别人误导了。实际上a是数组名代表数组的首地址(注意虽然数组名和指针都代表地址,但是数组名不是指针,指针是变量,这个a是常量,可以叫指针常量)而i实际上可以看做数组中的元素距离数组首地址的偏移量(距离)。*(a+i)...

...*号什么时候是指针,什么时候是取值啊!二位数组中元素引用被弄混了...
答:int a;int *p=&a;//*p是取值,p只a的地址,&p是指针的地址;二维数组;int a[2][2];int **p=a;p指向a地址,*p表示a[0][0];p则是a[0][0]的值 (*p+1)则是a[0][1]d的值 /// p就相当于数组名,1就是元素位置所占的内存字节。懂了没?