C语言难点之数组与指针
提到数组和指针,是C语言的精髓。下面就来讲一讲它们之间的爱恨情仇。
数组与指针的定义
char * ch=NULL;
char num[10]={0};
ch=num;
ch[1]=10;
num[1]=20;
在上面的情况下,两个是完全一样的可以进行互换。但是如果是下面这种情况就不同了。
*(++ch)=10;
*(++num)=20;
你觉得这时候num[1]会等于几呢?当然是编译器报错了呀,为什么?这就是数组名和指针的不同之处了,数组名是作为一个常量指针来看待的,它本身的值不可以改变,但是可以进行指针的运算,而ch作为指针,就可以随便改变它本身的值了,也就是可以作为左值。
数组作为函数的参数
将数组作为函数的参数传递进函数时,为什么还要把数组的大小做为另一个参数呢?比如
int countnumOfzero(int num[10],int n);
这不是已经把数组的大小10,传递进去了吗?如果你这么觉得,那可是大错特错了。其实数组在作为函数的参数传递进函数时,它的类型就变为了指针了。举个实例解释一下。
#include <stdio.h>
int countnumOfzero(int num[10],int n)
{
printf("%d\n",sizeof(num));
return 0;
}
int main(void)
{
int num[10]={0};
printf("%d\n",sizeof(num));
countnumOfzero(num,10);
return 0;
}
vc6.0编译输出如图所示。
从输出可以看到确实传进去的是指针,而不是整个数组了,如果使用下面的函数声明,与上面的函数也是一致的。
int countnumOfzero(int *num,int n);
所以其实传递数组作为函数的参数也是传值传递参数,只是可以通过指针的间接访问修改数而已。
数组的几个相关符号傻傻分不清
int a[10]={0};
那么a,a[0],&a[0],&a都代表什么意思呢?这里还是介绍一下指针的运算,我觉得明白了指针的运算才能明白&a指的是什么。
unsigned short b=10;
unsigned short *a=&b;
所以可以得出(unsigned int *)a+0x1就是104,因为此时a被强转为int类型的指针,就是它指向的元素是int型,而int型占4个字节,所以此时a+1,相当于加了4.
#include <stdio.h>
int main(void)
{
int a[10]={0};
int (*b)[10]=&a;
printf("%d %d\n",b,(b+1));
return 0;
}
因为b指针指向的元素是一个10个int元素的数组,所以它加1相当于加了40,与前面对于指针的运算是一致的。
#include <stdio.h>
int main(void)
{
int a[10]={0};
printf("%d %d\n",&a,(&a+1));
return 0;
}
#include <stdio.h>
int main(void)
{
int a[10]={0};
printf("%d %d\n",&a,(&a+1));
printf("%d %d\n",a,(a+1));
return 0;
}
你懂了吗?&a与a的区别!
一个方法让你可以分析无数维的数组
对于多维的数组,其实你就可以把它作为一维数组来看,因为不论多少维,他都是按照线性内存分配的,其实前面就说过,想学好C语言,内存首先要搞懂。可以稍微参考这篇文章当我们把多维数组看成一维的数组就比较好分析了。
int a[3][2];
欢迎关注我,一起成长,一起玩编程,回复C语言获取我的C语言学习资料。