指针与数组
指针就是内存地址,每一个存储单元都有一个32位编码的内存地址,指针指向某一变量,即把该变量的内存地址赋值给该指针
首地址:一段内存空间中第一个存储单元的地址。存储单元指针变量的加减,以指针所指向的类型空间为单位进行偏移。
```c
#include<stdio.h>
int main()
{
//一维数组与指针
// 1. 定义一个一维数组,数组名是这个数组的“首地址”。
int a[5]={1,2,3,4,5};
int i;
printf("%d\n",a); // a指向a[0],a[0]int的元素,a的类型就是 int* 4,+1跨度是4个字节
printf("%d\n",a+1);
printf("%d\n",&a); // &a这个地址指向整个数组,int(*)[5],+1跨度是整个数组的字节长度,即20个字节
printf("%d\n",&a+1);
int *p = a; //将a的地址赋给指针变量p,所以p指向a[0]
//访问一维数组元素的方法
//1、 下标法
for(i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
//2、 指针法(一)
for(i=0;i<5;i++)
{
printf("%d\n",*(p+i)); //p不会变,推荐使用这种方法
}
//2、 指针法(二)
for(i=0;i<5;i++)
{
printf("%d\n",*p++); //p会变!,不推荐
}
//二维数组与指针
//定义一个二维数组,数组名b是第一个一维数组的内存地址!
int b[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //b的类型是int* [4],+1跨度是16个字节
printf("%d\n",b);
printf("%d\n",b+1);
printf("%d\n",b[0]); //b[0]是第一个一维数组的第一个元素的内存地址!,类型是int* ,+1跨度是4个字节
printf("%d\n",b[0]+1);
printf("%d\n",&b); //&b这个地址指向整个数组,+1跨度是整个数组字节长度,即
//访问二维数组的方法
//一、 下标法
printf("%d\n",b[1][2]);
//二、 用行地址
printf("%d\n",*(b[1]+2)); //b[m]+n是想取出元素的地址,加上*即可取出该元素。
//三、 用数组名
printf("%d\n",*(*(b+1)+2)); //b指向b[0],b+1指向b[1],类型是int* [4],
// *(b+1)即a[1]的首地址,类型是int* ,然后再进行偏移取值。
//由法二与法三可以看出b[1]等价于*(b+1)
//总结:二维数组数组名的意思
//b[][] 是int类型
//b[] 是int*类型
//b 是int*[4]类型, 多维数组以此类推。
return 0;
}