十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我说明写在案例的备注里,你参考吧。
巫山ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
#includestdio.h
typedef struct st
{
int id;
}ST,*STP; //先定义类型 ST是结构类型 STP是结构指针类型
int main()
{
STP st[2];//这里st就是你要的结构指针数组
ST st1,st2;//这里我定义了2个结构变量,并赋值,让指针数组的元素分别指向这两个变量地址
st1.id=1;st2.id=2;
st[0]=st1;
st[1]=st2;
printf("%d,%d\n",st[0]-id,st[1]-id);//打印指针数组指向地址内容
return 0;
}
1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。
2、例程,分配3行4列二维数组:
#include stdio.h
#include malloc.h
int main()
{
int **a;
int i, j;
a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行
for (i = 0; i 3; ++i){//为每列分配4个大小空间
a[i] = (int*)malloc(sizeof(int)*4);
}
//初始化
for (i = 0; i 3; ++i){
for (j = 0; j 4; ++j){
a[i][j] = i+j;
}
}
//输出测试
for (i = 0; i 3; ++i){
for (j = 0; j 4; ++j){
printf ("%d ", a[i][j]);
}
printf ("\n");
}
//释放动态开辟的空间
for (i = 0; i 3; ++i){
free(a[i]);
}
free(a);
return 0;
}
/*
输出:
0 1 2 3
1 2 3 4
2 3 4 5
*/
数组名就是指针,例如:
#include stdio.h
void pr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
扩展资料:
注意事项
非数组类的声明尽量以指针的方式进行比较好。倘若一个指针指向的内存并不是一个数组,那么采用数组名的声明方式或许就会给人产生错误的引导。类似的,如果指向的是一个数组区域,则会给人以更加丰富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
与
int main(int argc,char** argv)
{
/* code here */
}
两种方式完全等价,但是前面一种能够更清晰地看出:这个参数是指向某个元素起始地址的指针,而后面的这种方式则不能够直观地看出这种含义。
c语言中,声明一个指针数组,char *s[1024 ] ,但并没有对它初始化,那它里面的数据(指针)是不确定的!
如果是全局变量,则里面的指针全是空指针
如果是局部变量,则里面的数据是不确定值,就象普通数组和变量一样,是不确定的数值。
指针数组定义int*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,
这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。
数组指针定义int(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址赋给p,也就是a[0]或a[0][0]
p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
扩展资料:
与数组指针关系
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
与二维数组对比
二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。
指针数组:如char*str_B[5]系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。
如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char*n[3]={"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例编辑
数组指针:
#includelt;stdio.hgt;
int main()
{
char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一个汉字=3个字节
char(*p)[4];
int i;p=c;//将指针定位于c[0]
for(i=0;ilt;=5;i++)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*p++
}
printf("\n");
for(i=5;igt;=0;i--)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*--p
}
return 0;
}
指针数组:
#includelt;stdio.hgt;
int main()
{
int i;
char*pch[6]={"妹","妹","你","坐","船","头"};
for(i=0;ilt;6;i++){
printf("%s,",pchlt;igt;);
}
printf("\n");
for(i=5;igt;=0;i--){
printf("%s\n",pchlt;igt;);
}
return 0;
}
参考资料:
百度百科——指针数组
#include stdio.h
int main(void)
{
char * test[] = {"1111", "2222", "3333"};
char * p[][3] = {{"1111", "2222", "3333"}};
puts(p[0][0]);
return 0;
}
//注意char * (*p)[] = 。。。 并不是声明数组,声明数组的方式是char * p[][3] = {{},{},{}...};
//char * (*p)[]只是声明变量,常用作函数的声明中作为形参来使用。