本文目录一览:
C语言数组基本问题
第一:
为什么p=s非法:因为C++数组中数组名字相当于是指向数组第一个元素的指针
所以 s相当于取一个指针的地址,你必须用 指向指针的指针int **p = s。这样才能保存。
第二:
而p=s[i]合法
s[i]是数组中的第i个元素的值。所以你可以用s[i]取到的是数组第i个元素的地址, int *p = s[i],用指针指向第i个元素地址。
怎么理解C语言的取值运算符“*”
我也是初学,我试试我的解释,你要当所有多维数组当成一维数组来看,因为编译器在解读数组时,就是这样的,首先你说的a是个二维数组,说是二维其实在内存中还是以一维形式存储,也就是线性存储,你可以想象一维数组在内存中是一个个排序的,二维数组是一段段排序的,每段就是一行,而编译器在解读二维数组时,会先把一行看成一个大元素,所以当时使用*a时,实际就是返回a第一行(这个大元素)存储的值,而这个值也就是一维数组的地址值,当使用a+1时,就是行指向,若想指向行中的小元素,必须要使用*返回一次,得到一维数组后,这时候+1就是在按小元素指向,若想返回这个元素的值,就要再使用一个*取值
c语言中如何使返回值为数组
1、注意C/C++不能直接返回一个数组。这是由于在C/C++中,数组不是一种类型,因此不能被直接返回。
2、在C/C++中,一般有两种方法来返回一个数组。
第一种方法:
返回一个指向数组的指针,例如char (*retArray)[10]声明了一个函数retArray,该函数可以返回指向具有10个char元素的数组例子如下:#include#includeint (*retArray())[10]{int (*a)[10];int i=0;/*动态开辟空间*/
a=calloc(10,sizeof(int));/*赋值*/for(i=0;i10;i++){(*a)[i]=i;}return a;}int main(){int (*b)[10];
/*函数返回指向数组的指针*/
b=retArray();
/*打印第一个元素*/
printf("%d/n",(*b)[0]);
/*释放空间*/free(b);return 0;}第二种方法:
如果你不喜欢用指针的形式返回数组,那么可以采用返回一个结构的形式。这种形式相对较安全,可以避免忘记释放指针而造成内存泄露,也可以避免访问悬挂指针造成的错误。但缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
例子如下:#includestruct tag{int a[10];}x,y;struct tag retArray(){int i=0;for(i=0;i10;i++)
x.a[i]=i;return x;}int main(){struct tag y=retArray();
printf("%d/n",y.a[3]);return 0;}注意:(1)在返回指针时要切记要避免内存泄露和访问悬挂指针。
(2)很多人认为指针和数组等价的,这是错误的。int (*a)[10]和int b[10]两者是不能直接用a=b来赋值的。在数组和指针作为函数参数传递时,二者可以认为等价,这是因为数组会被转化为指针来传递。
(3)返回多维数组方法类似。