在这里插入代码片
## 善于利用指针
#include<stdio.h>
int main()
{
int a = 2, b = 10;//通过地址查到int型占4个字节。
int * pointer_1, * pointer_2;//通过地址值,0x00b3f9ec,可以发现地址是4个字节。
int c[10] = {1,3,4,5,6,7,8,9,22,33};
//int d[3][4] = { {1,3,5,7},{9,11,13,15},{17,19,21} };
int d[3][4] = { 1,3,5,7,9,11,13,15,17,19,21};
pointer_1 = &a;
pointer_2 = &b;
printf("a=%d,b=%d\n", a, b);
printf("*pointer_1 =%d,*pointer_2 =%d\n", *pointer_1, *pointer_2);
printf(" &c=%p,&c[0]=%p\n", &c, &c[0]);
printf(" &d[0][0]=%p,&d[0]=%p,&d=%p\n", &d[0][0], &d[0],&d);
printf(" &d[0][0]+1=%p,&d[0]+1=%p,&d+1=%p\n", &d[0][0]+1, &d[0]+1, &d+1);// &d[0][0]+1 相当于加了加0x04,&d+1相当于加0x40(一个数是4个字节)
printf(" d[0][0]+1=%d,d[0]+1=%p,d+1=%p\n", d[0][0] + 1, d[0] + 1, d + 1);// d[0]+1 相当于加了加0x04,&d+1相当于加0x10(一个数是4个字节)
return 0;
}
为了验证上文所说的信息
int main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int * p;
int b=0;
for (p = a[0]; p < a[0] + 12; p++)
{
if ((p - a[0]) % 4 == 0) printf("\n");
printf("%4d", *p);
b++;
}
for (p = &a[0][0]; p < &a[0][0] + 12; p++)
{
if ((p - &a[0][0]) % 4 == 0) printf("\n");
printf("%4d", *p);
b++;
}
printf("\n");
printf("b=%d", b);
return 0;
}
int main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (* p)[4];
int i, j;
for (i = 0; i < 3;i++)
for (j = 0; j <4; j++)
{
printf("a[%d,%d]=%d\n",i,j,*(*(a+i)+j));
if (j/3)
{
printf("\n");
}
}
printf("\n");
return 0;
}
int main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (* p)[4];
int b[4] = { 1,2,3,4 };
int i, j;
for (i = 0; i < 3;i++)
for (j = 0; j <4; j++)
{
printf("a[%d,%d]=%d\n",i,j,*(*(a+i)+j));
if (j/3)
{
printf("\n");
}
}
printf("%p,%p,%p,%p",b, &b,b+1, &b + 1);
printf("\n");
return 0;
}
对于一维而言:a[i]=(a+i);
对于二维而言:a[i] [j] = ((a+i)+j)
关键点:
int * a;
int * a[3];
int (*a)[3] ;
char a[]=“123223”;
char a=“123223”;
指针变量指向的是一个数,一个字符,还是一个行,一个字符串,还是一个二维数组;
int( *p)(int,int) -> int max(int,int);指向函数的指针。
指针可以指向:一个数,一个数组,一个二位数组,一个字符,一个字符串,一个函数。即一个指针变量可以指向一个变量!
区分:指针,指针变量。
指针就是一个地址。指针变量表示地址指向的变量。
同一个指针,同一个地址,可以是不同的指针变量,也就指向不同的变量。