1 64位系统下,分别定义如下两个变量:char *p[10] ; char (*p1)[10] ; ,请问,sizeof(p) 和 sizeof(p1) 分别值为 80 和 8.
指针数组:array of pointers ,即用于存储指针的数组,也就是说数组元素是指针,本质上是数组
指针数组的定义: 类型说明符 *指针数组名[ 长度 ] = { 初值 };
数组指针:a pointer to an array ,即指向数组的指针 , 本质上是指针
指向一维数组指针的定义: 类型说明符 (*指针变量名)[ 一维数组长度 ] [ = 初值 ];
例如:
{
int a[4][5];
int (*p)[5]=a;
}
这里a是一个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向包含5个int元素的一维数组,此时 p 的增量 以它所指向的一维数组长度为单位;
*p+i是二维数组a[0][i]的地址;
*(p+2)+3表示a[2][3]地址(第一行第一列皆表示为0行0列),*(*(p+2)+3)表示a[2][3]的值。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
(*p)[5]其中的5在上述例子中没有表示任何意思,你可以换成除0以外的整数,[5]的作用就是帮助你记住你所指向的一维数组的长度。
(不过除了与定义的二维数组的长度一致的不会警告之外)其它的数会警告但是不影响结果。
在函数定义中,形式参数 char s[ ] 和 char *s 是等价的。 表示的是一个指针。
当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量,因此,数组名必须是一个指针,也就是一个存储地址值的变量。
2 在32位系统下,请计算sizeof的值
char str[ ] = “http://www.xxxxx.com";
char *p = str;
int n = 10;
请计算
sizeof( str ) = <span style="color:#cc0000;">21
</span>sizeof( p ) = <span style="color:#ff0000;">4
</span>sizeof( n ) = <span style="color:#ff0000;">4
</span>void Foo ( char str[100] ){ }
请计算 sizeof( str ) = <span style="color:#ff0000;">4
</span>void *p = malloc ( 100 );
请计算 sizeof ( p ) = <span style="color:#ff0000;">4</span>