指针数组的创建和用法
创建一个指针数组,每个元素是一个指针,然后用NEW给各个指针分配一个一维的堆内存数组,那么最后表示出来就像是一个二维的堆内存数组。编写一段程序,实现一个大小为8*8的二维...
创建一个指针数组,每个元素是一个指针,然后用NEW给各个指针分配一个一维的堆内存数组,那么最后表示出来就像是一个二维的堆内存数组。编写一段程序,实现一个大小为8*8的二维堆内存数组。
0 1 2 3 4 5 6 7 8
9 10 。。。。。。。
以此类推 展开
0 1 2 3 4 5 6 7 8
9 10 。。。。。。。
以此类推 展开
展开全部
创建:
(1)声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素。
(2)声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素。
(3)声明一个指针,调用malloc(),然后使用该指针来访问数组元素。malloc接受一个参数:所需内存字节数。然后malloc()找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。因为char代表一个字节,所以传统上曾将malloc()定义为指向char的指针类型。然而,ANSI
C标准使用了一个新类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。如果malloc()找不到所需的空间,它将返回空指针。我们使用malloc()来创建一个数组,可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。例如,考虑以下代码:
double * ptd;
ptd = (double
*)malloc(30*sizeof(double));
使用第二种或第三种方法可以做一些用普通的数组声明做不到的事;创建一个动态数组(dynamic
array),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组。例如,假定n是一个整数变量。在C99之前,不能这样做:
double item[n]; /*如果n是一个变量,C99之前不允许这样做*/
然而,即使在C99之前的编译器中,也可以这样做:
ptd=(double
*)malloc(n*sizeof(double));
变长数组VLA和malloc的用法有两点区别。一个区别在于VLA是自动存储的。自动存储的结果之一就是VLA所用内存空间在运行完定义部分之后会自动释放。因此不必使用free()。另一方面,使用由malloc()创建的数组不必局限在一个函数中。例如,函数可以创建一个数组并返回指针,供调用该函数的函数访问。接着,后者可以在它结束时调用free()。free()可以使用不同于malloc()指针的指针变量;必须一致的是指针中存储的位置。
用法:
//注意指针数组和数组指针分别是如何指向二维数组的
#include
<stdio.h>
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+4*i));
}
printf("\n");
}
printf("\n");
}
(1)声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素。
(2)声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素。
(3)声明一个指针,调用malloc(),然后使用该指针来访问数组元素。malloc接受一个参数:所需内存字节数。然后malloc()找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。因为char代表一个字节,所以传统上曾将malloc()定义为指向char的指针类型。然而,ANSI
C标准使用了一个新类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。如果malloc()找不到所需的空间,它将返回空指针。我们使用malloc()来创建一个数组,可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。例如,考虑以下代码:
double * ptd;
ptd = (double
*)malloc(30*sizeof(double));
使用第二种或第三种方法可以做一些用普通的数组声明做不到的事;创建一个动态数组(dynamic
array),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组。例如,假定n是一个整数变量。在C99之前,不能这样做:
double item[n]; /*如果n是一个变量,C99之前不允许这样做*/
然而,即使在C99之前的编译器中,也可以这样做:
ptd=(double
*)malloc(n*sizeof(double));
变长数组VLA和malloc的用法有两点区别。一个区别在于VLA是自动存储的。自动存储的结果之一就是VLA所用内存空间在运行完定义部分之后会自动释放。因此不必使用free()。另一方面,使用由malloc()创建的数组不必局限在一个函数中。例如,函数可以创建一个数组并返回指针,供调用该函数的函数访问。接着,后者可以在它结束时调用free()。free()可以使用不同于malloc()指针的指针变量;必须一致的是指针中存储的位置。
用法:
//注意指针数组和数组指针分别是如何指向二维数组的
#include
<stdio.h>
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+4*i));
}
printf("\n");
}
printf("\n");
}
展开全部
student s[]表示s是个指针,指向一个student数组的首地址,当你使用search函数的时候,在这个函数里创建了一个自动变量s,它的值是传递给该函数的student数组a的首地址,意思就是说s现在和a一样都指向同一个student数组的首地址,但是请注意:s和a是两个不同的指针,他们仅仅是指向了同一个数组,这就像a=5,b=5一样,a b 虽然值一样但是是不同的变量。所以当search函数结束的时候指针s所占用的4个字节的空间被释放掉了,s这个变量也就消失了,但是s指向的数组毕竟是主函数中创建的数组,它不会因为search结束而消失,只会在主函数结束时才会消失,所以你的程序不会有问题。
你可以试试在search中定义一个student数组,并且最后返回他的一个元素的地址,并在主函数中使用该地址,到时候你就会发现程序会运行错误了。
传递数组和传递指针的道理是一样的,都是在子函数中创建了一个新的变量用来存储传入指针的值,也就是传入指针所指向数据的地址,子函数结束时只是把新创建的指针变量销毁罢了,对指向的数据没有影响。
还有什么不明白的地方再问我吧
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
你可以试试在search中定义一个student数组,并且最后返回他的一个元素的地址,并在主函数中使用该地址,到时候你就会发现程序会运行错误了。
传递数组和传递指针的道理是一样的,都是在子函数中创建了一个新的变量用来存储传入指针的值,也就是传入指针所指向数据的地址,子函数结束时只是把新创建的指针变量销毁罢了,对指向的数据没有影响。
还有什么不明白的地方再问我吧
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的意思应该是动态的二维数组吧
//创建行指针
x = new int* [8];
//为每一行分配空间
for (int i =0;i<8;i++)
x[i] = new int[8];
//为数组输入数据
int count = 0;
for(int m = 0;m<8;m++)
for(int n = 0;n<8;n++)
{
x[m][n] = count;
count++;
}
不知道你是我写的这个意思不 要是不对的话 你可以再问我
//创建行指针
x = new int* [8];
//为每一行分配空间
for (int i =0;i<8;i++)
x[i] = new int[8];
//为数组输入数据
int count = 0;
for(int m = 0;m<8;m++)
for(int n = 0;n<8;n++)
{
x[m][n] = count;
count++;
}
不知道你是我写的这个意思不 要是不对的话 你可以再问我
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
高中学的,现在都忘了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询