想要了更容易的了解指针,很好的用法就是通过数组来了解,在c里面,感觉一维数组和一级指针的用法差不多,二维数组和二级指针的用差不多,所以通过数组来了解指针是一种很好的方法;
数组:将相同 数据类型 的元素按一定顺序排列的集合,把有限个类型相同的 变量 用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组
其实我们可以把数组看成是一个字符串,就像是C++中的string字符串类型的变量一样,因为c中没有关于字符串变量的定义,我们可以把数组看成是一个字符串吧!
数组和字符类型是不一样的;
{
char a;
char b[64];
a = ‘a‘;
strcpy(b,"aaa");
}
就像上面这样字符类型在空间中只分配有一个字节,而数组可以自定义的分配空间,数组写入数据的时候也不像字符类型那样可以直接写入,可以通过键盘输入,要么就是像上面那样;当然还有memcpy(),strncpy()等,这里就不一一举例了;
然后上面这段代码要是这样写:
{
char a;
char b[64];
a = ‘a‘;
strcpy(b,"aaa");
printf("%c\n",a);// 输出 a
printf("%d\n",a);//输出 a 在ASCLL中的序号97
printf("%d\n",&a);// 输出a的地址不同电脑可能不一样
printf("%d\n",&b);//输出地址7863796
printf("%d\n",b);///输出7863796
printf("%d\n",&b[0]);//输出地址7863796
system ("pause");
}
我们发现输出&b,b,&b[0] 竟然都是b的地址,那么我们可不可以吧b看成是指向b首地址&b[0]的指针呢?
{
char b[64];
char *c = NULL;
c = b;// 将一维数组的地址传递给指针
//或者 c = &b;
printf("%d\n",b);
printf("%d\n",c);
}
我们发现打印出来的结果是一样的,那么关于用法上我们也可以看看,其实这一点在数组作参数的退化问题哪里我已经写过了;
{
char a[64] = "aaaa";//直接往空间赋值了
char *b = NULL;
int i = 0;
int j = 0;
i = strlen(a);//计算字符串的个数
b = a;//将地址传递给b
//下面打印字符串,一个一个的通过下标打印
for(j = 0 ; j < i : i++)
{
printf("%c ",a[i]);
}
putchar(‘\n‘);//换行
for(j = 0 ; j < i : i++)
{
printf("%c ",b[i]);
}
//或者
for(j = 0 ; j < i : i++)
{
printf("%c ",*(b +j));
}
}
我们发现printf("%c ",a[i]);,printf("%c ",b[i]);,printf("%c ",*(b +j));三种输出都可以将字符打印出来,效果完全一样,所以我们可以将一级指针看成是一维数组,一维数组看成指针;但是记住这里是看成,不能理解为是等价的;比如一级指针取地址可以传递给二级指针但是数组就不能。所以说如果用的话,我们可以把指针当成数组使用。
原文:http://www.cnblogs.com/huhaihao/p/7594449.html