c语言数组与指针

数组与指针

数组元素与普通变量一样,也有自己的地址。并且数组元素间地址是相邻的。(数组名在数值上为首元素的地址)

int a[10];		int *p;	p = &a[0];100赋值给a[0], 有几种表示方法?
	a[0] = 100;	*&a[0] = 100;	*p = 100;
p的内容是&a[0], &a[1] - &a[0] == 4
		=>  &a[1] = &a[0] + 4
		=>  &a[1] = p + 4; ????????????
			NONONONONO

指针加减的问题: p + i

指针加减不是简单地加减数值,而是加减i个指向单元长度。
例:

p + 1 == &a[1]
p + 1 *sizeof(int)
=> *(p+1) <=> *(&a[1])
*(p+i)	<=> p[i], when i>=0
a[5] <=> *(a + 5)

示例代码:

#include <stdio.h>

int main()
{	
	int a[10] = {1,2,3,4,5,6,7,8,9,10};   int *p;
	p = &a[0] ;// p = a;
	//*p = 100;
	// p  = &a[0], p+ 1 => &a[1],  *(p+1)=>*&a[1] => a[1]
	//*(p+1) = 100;
	//printf("a[1] = %d\n", a[1]);
	a[5] = 100;
	//*&a[5] = 100;
	//*(a + 5) = 100;
	//*(p+5) = 100; //*(p+i)	<=> p[i], when i>=0
	//p[5] = 100;
	//*&p[5] = 100;
	printf("%d\n", a[5]);
	printf("%d\n", *&a[5]);
	printf("%d\n", *(a+5));
	printf("%d\n", *(p+5));
	printf("%d\n", p[5]);
	printf("%d\n", *&p[5]);
	
	return 0;
}

数组名与指针

1.数组名是常量指针
2.是指针就有类型,并且指针的类型决定指针作加减时的单位长度

数组名是什么类型的指针 ?
1.数组名可以看作是指向数组第一个元素类型的常量指针。并且数组名在
2.数值上为第一个元素的地址值(首地址)
3.数组名代表整个数组;

示例代码:

int main()
{	
	int a[10] = {1,2,3,4,5,6,7,8,9,10};
	//printf("a = %p, a + 1 = %p, &a + 1 = %p\n",a,a + 1,&a + 1);
	int b[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	//printf("b = %p, b + 1 = %p, &b + 1 = %p\n",b, b + 1, &b + 1);
	printf("b = %p, b[0] = %p , b[0] + 1 = %p\n",b, b[0], b[0] + 1);
	
	return 0;
}

多维数组与指针

int a[3][4];
表达式   			表达式的含义 			     表达式的值 
a				typeof(a[0])const *		     在数值上为第一个元素的
				=>	int[4] const *		     地址。&a[0][0]
a[0]				typeof(a[0][0])	const *		  &a[0][0]
					int const *
&a[0][0]			数组元素a[0][0]的地址

a+1				&a[1], typeof(a[1]) *	     在数值上与&a[1][0]相同	
&a[1]			typeof(a[1]) *, int[4] *      在数值上与&a[1][0]相同
a[1]			数组名,typeof(a[1][0])*
				int *					     	 在数值上与&a[1][0]相同
*(a+1)			与a[1]等价

a[1]+2			&a[1][0] + 2 =>&a[1][2]
*(a+1)+2		a[1] +2
&a[1][2]

*(a[1] +2)		*&a[1][2]=> a[1][2]
*(*(a+1)+2)
a[1][2]

示例代码:

int main()
{	
	int a[3][4];
	//	a,    typeof(a[0]) const *, => int[4] *
	int *p; 
	//typeof(a[0]) *p;
	//p = a; //  int * = int[4] *
	//p = a[0];  //a[0], typeof(a[0][0])  *, int *
	p = &a[0][0]; //&a[0][0], 是一个指针,指向a[0][0]
	//这个指针的类型很显然是,typeof(a[0][0]) *, int *
}

数组指针 与 指针数组

int a[10];
int *b[10];

如果我们要定义一个指针p,来保存a的地址, 该如何定义p ??

typeof(a) *p;
p = &a;

typeof(a) => int [10]
int[10] *p => int (*p)[10];

上面p就是一个指针,指向一个数组(int [10]),那么我们把p叫做数组指针。

int *p[10];

上面p是一个数组,数组名为p,里面有10个元素,每个元素都int * 类型(指针类型),那么我们把p叫做指针数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值