数组与指针
数组元素与普通变量一样,也有自己的地址。并且数组元素间地址是相邻的。(数组名在数值上为首元素的地址)
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叫做指针数组。