指针数组的创建和用法

指针数组的创建和用法,第1张

创建:
(1)声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素
(2)声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素。
(3)声明一个指针,调用malloc(),然后使用该指针来访问数组元素。malloc接受一个参数:所需内存字节数。然后malloc()找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。因为char代表一个字节,所以传统上曾将malloc()定义为指向char的指针类型。然而,ANSI
C标准使用了一个新类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。如果malloc()找不到所需的空间,它将返回空指针。我们使用malloc()来创建一个数组,可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。例如,考虑以下代码:
double

ptd;
ptd
=
(double
)malloc(30sizeof(double));
使用第二种或第三种方法可以做一些用普通的数组声明做不到的事;创建一个动态数组(dynamic
array),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组。例如,假定n是一个整数变量。在C99之前,不能这样做:
double
item[n];
/如果n是一个变量,C99之前不允许这样做/
然而,即使在C99之前的编译器中,也可以这样做:
ptd=(double
)malloc(nsizeof(double));
变长数组VLA和malloc的用法有两点区别。一个区别在于VLA是自动存储的。自动存储的结果之一就是VLA所用内存空间在运行完定义部分之后会自动释放。因此不必使用free()。另一方面,使用由malloc()创建的数组不必局限在一个函数中。例如,函数可以创建一个数组并返回指针,供调用该函数的函数访问。接着,后者可以在它结束时调用free()。free()可以使用不同于malloc()指针的指针变量;必须一致的是指针中存储的位置。
用法:
//注意指针数组和数组指针分别是如何指向二维数组的
#include
<stdioh>
main()
{
static
int
m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int
(p)[4];//数组指针
p是指针,指向一维数组,每个一维数组有4个int元素p是个数组的地址,p就是数组元素了
int
i,j;
int
q[3];//指针数组
q是数组,数组元素是指针,3个int指针
p=m;
//p是指针,可以直接指向二维数组
printf("--数组指针输出元素--\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("]
",((p+i)+j));
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++,p++)//p可看成是行指针
{
printf("=
",p);//每一行的第一个元素
printf("=
",(p+1));//每一行的第二个元素
printf("=
",(p+2));//每一行的第三个元素
printf("=
",(p+3));//每一行的第四个元素
printf("\n");
}
printf("\n");
printf("--指针数组输出元素--\n");
for(i=0;i<3;i++)
q[i]=m[i];//q是数组,元素q[i]是指针
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("=
",q[i][j]);//q[i][j]可换成(q[i]+j)
}
printf("\n");
}
printf("\n");
q[0]=m[0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("=
",(q[0]+j+4i));
}
printf("\n");
}
printf("\n");
}

同意楼上,其实指针就是数组的首地址,只不过指针加1的含义是移动数组中数据类型的长度而已,比如char p={‘a’,‘b’,‘c’};假设char占一个字节,若p的地址为0x0000,即‘a’所在的地址为0x0000,那么p+1的地址为0x0001,地址中存储的数据为‘b’,获取方法为(p+1),其他类推。同理若int p={1,2,3};假设int占4个字节,若p的地址为0x0000,即1所在的地址为0x0000,那么p+1的地址为0x0005,地址中存储的数据为2,获取方法为(p+1)。不知这个能否能理解。。。

例子如下:
#include <stdioh>
#include <stdlibh>
int add(int a, int b);
int sub(int a, int b);
void main(void)
{

int (p[2])(int a, int b); // 其实质和指向函数的指针是一样的
p[0] = add;
p[1] = sub;
printf("%d\n", p[0](5,3));
printf("%d\n", p[1](5,3));
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
不明白hi我。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13333169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-16
下一篇 2023-07-16

发表评论

登录后才能评论

评论列表(0条)

保存