初出茅庐的小李第11篇博客之嵌入式C语言学习总结(有关指针和数组)

指针和数组有亲戚吗?

我觉得有
但是啥亲戚我还没有完全摸清楚,反正有关系,具体关系是啥,需要慢慢学习去理解;

#include

int main(void)
{
	char str[128];
	printf("请输入Aqst-666\n");
	scanf("%s",str);
	printf("初出茅庐的小李ID是:%s\n",str);
	
	printf("str 的地址是:%p\n",str);
	printf("str[0] 的地址是:%p\n",&str[0]);
	return 0;
} 

字符串数组元素的访问,好像就是这么个关系,我们传进去的是地址,换句话说我们传进去的其实就是个指针!

初出茅庐的小李第11篇博客之嵌入式C语言学习总结(有关指针和数组)_第1张图片

数组里面一个奇怪的现象

我们知道数组里面的元素开辟的地址是连续的,我们可以输出不同类型变量的地址进行查看,但是当用到取地址符号来计算相邻元素地址之间的差值是发现了一个奇怪的现象;对于数组a[]来说&a[2]-&a[1] 并不是表示简单的地址相减,而是地址之差/sizeof(type) 即这两个变量之间相差了几个该类型的值。
但是如果这里是&a如果这里是&a[3]-&a[0],那么结果输出为3。double竟然还是例外!至于原因我也还没有弄清楚,先记下来以后去研究。

研究出来了,代码编写错误,我也是醉了,低级错误,最后的做差应该是&d[3]-&d[0]

#include
int main(void)
{
	char a[]="Aqst-666";
	int b[5]={1,2,3,4,5};
	float c[5]={1.1,2.2,3.3,4.4,5.5};
	double d[5]={1.1,2.2,3.3,4.4,5.5};
	
	printf("a[0]->%p,a[1]->%p,a[2]->%p,a[3]->%p,a[4]->%p\n",&a[0],&a[1],&a[2],&a[3],&a[4]);
	printf("b[0]->%p,b[1]->%p,b[2]->%p,b[3]->%p,b[4]->%p\n",&b[0],&b[1],&b[2],&b[3],&b[4]);
	printf("c[0]->%p,c[1]->%p,c[2]->%p,c[3]->%p,c[4]->%p\n",&c[0],&c[1],&c[2],&c[3],&c[4]);
	printf("d[0]->%p,d[1]->%p,d[2]->%p,d[3]->%p,d[4]->%p\n",&d[0],&d[1],&d[2],&d[3],&d[4]);
	
	printf("char型地址偏移字节数=%d\n",(int)(&a[1]-&a[0])*sizeof(char));
	printf("char型(int)(&a[1]-&a[0])=%d\n",(int)(&a[1]-&a[0]));
	printf("char型(int)(&a[3]-&a[0])=%d\n\n",(int)(&a[3]-&a[0]));
	
	printf("int型地址偏移字节数=%d\n",(int)(&b[1]-&b[0])*sizeof(int));
	printf("int型(int)(&b[1]-&b[0])=%d\n",(int)(&a[1]-&a[0]));
	printf("int型(int)(&b[3]-&b[0])=%d\n\n",(int)(&b[3]-&b[0]));
	
	printf("float型地址偏移字节数=%d\n",(int)(&c[1]-&c[0])*sizeof(float));
	printf("float型(int)(&c[1]-&c[0])=%d\n",(int)(&c[1]-&c[0]));
	printf("float型(int)(&c[3]-&c[0])=%d\n\n",(int)(&c[3]-&c[0]));
	
	printf("double型地址偏移字节数=%d\n",(int)(&d[1]-&d[0])*sizeof(double));
	printf("double型(int)(&d[1]-&d[0])=%d\n",(int)(&d[1]-&d[0]));
	printf("double型(int)(&d[3]-&d[0])=%d\n\n",(int)(&d[1]-&d[0]));
	/* &a[2]-&a[1] 并不是表示简单的地址相减,而是地址之差/sizeof(type) 即这两个变量之间相差了几个该类型的值。
	如果这里是&a如果这里是&a[3]-&a[0],那么结果输出为3。double还是例外!至于原因我还没去查,先记了之后再补充。 
	*/
	return 0;
}

初出茅庐的小李第11篇博客之嵌入式C语言学习总结(有关指针和数组)_第2张图片

修改后代码

#include
int main(void)
{
	char a[]="Aqst-666";
	int b[5]={1,2,3,4,5};
	float c[5]={1.1,2.2,3.3,4.4,5.5};
	double d[5]={1.1,2.2,3.3,4.4,5.5};
	
	printf("a[0]->%p,a[1]->%p,a[2]->%p,a[3]->%p,a[4]->%p\n",&a[0],&a[1],&a[2],&a[3],&a[4]);
	printf("b[0]->%p,b[1]->%p,b[2]->%p,b[3]->%p,b[4]->%p\n",&b[0],&b[1],&b[2],&b[3],&b[4]);
	printf("c[0]->%p,c[1]->%p,c[2]->%p,c[3]->%p,c[4]->%p\n",&c[0],&c[1],&c[2],&c[3],&c[4]);
	printf("d[0]->%p,d[1]->%p,d[2]->%p,d[3]->%p,d[4]->%p\n",&d[0],&d[1],&d[2],&d[3],&d[4]);
	
	printf("char型地址偏移字节数=%d\n",(int)(&a[1]-&a[0])*sizeof(char));
	printf("int型地址偏移字节数=%d\n",(int)(&b[1]-&b[0])*sizeof(int));
	printf("float型地址偏移字节数=%d\n",(int)(&c[1]-&c[0])*sizeof(float));
	printf("double型地址偏移字节数=%d\n",(int)(&d[1]-&d[0])*sizeof(double));
	
	/* &a[2]-&a[1] 并不是表示简单的地址相减,而是地址之差/sizeof(type) 即这两个变量之间相差了几个该类型的值可以理解成指针偏移量,那么指针偏移量*sizeof(type)就可以算出地址之差了。
	如果这里是&a[3]-&a[0],那么结果输出为3。double还是例外,(其实是我的意外)至于原因,现在发现了,代码编写错误
	*/
	return 0;
}

修改后运行结果

初出茅庐的小李第11篇博客之嵌入式C语言学习总结(有关指针和数组)_第3张图片

结语:不试不知道,一试吓一跳,原来这里面这么讲究呢!指针数组之间到底还有多少联系,需要小李慢慢探寻啊!说好的不熬夜呢,又TMD(挺萌的)熬夜了。。。。。。。。。。。。。。。。。。。。。。。。。
初出茅庐的小李第11篇博客之嵌入式C语言学习总结(有关指针和数组)_第4张图片

你可能感兴趣的:(笔记,嵌入式,c语言,指针)