指针数组*a[]和指向指针指向数组的指针变量**a有什么关系?

数组指针与指针数组的区别在于:数组指针p是一个指针,而指针数组p是一个存放N个指针变量的数组。
用于指向一个二维数组。
重点:()优先级高([]、()的优先级是一样的,但它们的方向是从左至右的,所以先运行括号里的*p),首先说明p是一个指针,指向一个整型的一维数组,n是指一位数组的长度,在二维数组中列数就是每一个一位数组的长度,行数是一位数组的个数。也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度(n*sizeof(int))。
如要将二维数组赋给一指针,应这样赋值:
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
同时用来指向二维数组时,其引用和用数组名引用都是一样的即a<=>p。比如要表示数组中i行j列一个元素a[i][j]:

重点:[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素:即它就是一个存放了n个指针的数组。
这样赋值也是错误的:p=a;因为p是个右值,p的值只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],默认情况下这三个指针变量都指向NULL的,所以要分别赋值。

}

在中,对字符串的操作主要有两种方式,一是使用字符数组,char str[];二是使用字符指针。那么二者有什么区别呢?下面将分述二者的使用,最后进行比较。

        使用char str[]定义一个字符数组str,中括号内可以写上数字表示数组大小,也可以不写。如果不写数字,则必须为字符数组提供初始值,以便编译器进行内存分配。


只能对字符数组元素的赋值,而不能用赋值语句对整个数组赋值,如:


可以使用循环将字符数组中的字符一个一个输出,也可以使用cout<<str1直接输出整个数组。

需要注意的是,上述代码中str1和str2是C风格字符串,而str3不是。C风格字符串,是指以\0结尾的字符数组。C++为了兼容C,而保留了C中字符串的使用方法。

str1和str2使用字符串字面值进行初始化,字符串字面值使用\0表示字符串结束。因此str2长度为6,需要将\0计算在内。使用strlen函数,计算的是字符串的实际长度,不包含\0。

而str3则不一样,它没有\0作为结束标志,因而不是C风格字符串,使用cout<<str3可能会出现意想不到的结果。

可以使用char *str指向一个字符串。如:


字符指针也可指向C风格字符串,如ptr就是指向的C风格字符串。如果让ptr指向上节中的str3,输出ptr会出现同样的意想不到的结果。毕竟数组名其实就是一种指针。

前面简单介绍了一下两种操作字符串的方法,这部分进行比较,是本文的重点。如下代码:

这些代码应该能够说明char s[]和char *ptr之间的相似点了。它们都是指向字符串的指针。

下面说二者的不同之处。如下一段代码:

该段代码在VS2010下编译可以通过,但是运行时程序会停止工作,为什么呢?原因在于p[0]='c'这一语句。该语句试图修改p指向的字符串的首个字符,出现了错误。

原因在于两种方式对字符数组操作的机制不同。使用char *p="C++"语句后,编译器在内存的文字常量区分配一块内存,保存”C++“这一字符串字面值,然后在栈上分配内存保存p,p的内容为"C++"的地址。p[0]='c'试图修改常量”C++“,程序当然就会崩溃了。而char ss[]="C++"语句,定义了一个数组,编译器为其在栈上分配了内存空间,因而可以进行修改操作。

(1)char ss[]定义了一个数组,ss可认为是一个常指针,ss不可改变,但ss指向的内容可以发生改变。

(2)char *p定义了一个可变指针,p可以指向其它对象。但对于char *p=”abc“这样的情况,p指向的是常量,故内容不能改变。


调用该函数,不一定能够得到正确的结果。因为str定义了一个局部数据,是局部变量,存在于函数strA中的栈帧中。当函数调用完成后,栈帧恢复到函数strA调用前的状态,临时空间被重置,为函数分配的栈空间被收回,str所指向的地址也就不存在了。


该函数能够正常运行,因为str指向的字符串字面值被保存在只读的数据段,是全局的,当函数调用完成后,str指向的地址未发生变化。

综上,可以看出使用char []较容易出错,可能出现不确定的结果。C++提供的string类相比之下,要安全的多了。

}

我知道a[0]是&a[0][0],那为什么*(a+0)会是一个指针呢,a不是是&a[0][0]吗,那*a不应该是一个指针所指向的地址里面的值吗,不应该说*a=a[0][0]吗

多维数组中指针和一维数组中的指针是不一样的,以二维数组为例来说;
int a[3][4];// 二维数组的每一行都可以看成是一个一维数组
数组名a 是二维数组的首地址
a+0 也是二维数组的首地址,也可以看成是二维数组行下标为0那行的首地址
a+1 是二维数组行下标为1的那行元素的首地址
a+2 是二维数组行下标为2的那行元素的首地址
a[0] 是第0行的首地址,也是第0行第0列的地址
a[1] 是第1行的首地址,也就是第1行第0列的地址
a[2] 是第2行的首地址,也就是第2行第0列的地址
*(a+0) 这里的*号不是取内容符号,根据一维数组和指针的关系,*a(+0)指针a[0]的另一种表示方式,

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 指向数组的指针变量 的文章

更多推荐

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

点击添加站长微信