java数组动态添加元素
c语言对数组元素的引用方法?
c语言对数组元素的引用方法?
一般就两种
一个是直接调用
也就是下标方式
比如a[i]
另一种是指针方式
比如
*(a i)
和a[i]等价。
如果一定要说第三种
那就是很少用的i[a];
编译是可以过的,但实际上 没人这么写
char*指针数组怎么创建?
创建:
(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
ltstdio.hgt
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指针
pm //p是指针,可以直接指向二维数组
printf(#34--数组指针输出元素--
#34)
for(i0ilt3i )
{
for(j0jlt4j )
{
printf(#34] #34,*(*(p i) j))
}
printf(#34
#34)
}
printf(#34
#34)
for(i0ilt3i ,p )//p可看成是行指针
{
printf(#34 #34,**p)//每一行的第一个元素
printf(#34 #34,*(*p 1))//每一行的第二个元素
printf(#34 #34,*(*p 2))//每一行的第三个元素
printf(#34 #34,*(*p 3))//每一行的第四个元素
printf(#34
#34)
}
printf(#34
#34)
printf(#34--指针数组输出元素--
#34)
for(i0ilt3i )
q[i]m[i]//q是数组,元素q[i]是指针
for(i0ilt3i )
{
for(j0jlt4j )
{
printf(#34 #34,q[i][j])//q[i][j]可换成*(q[i] j)
}
printf(#34
#34)
}
printf(#34
#34)
q[0]m[0]
for(i0ilt3i )
{
for(j0jlt4j )
{
printf(#34 #34,*(q[0] j 4*i))
}
printf(#34
#34)
}
printf(#34
#34)
}