对数组的定义:数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。
格式:
一维数组:数据类型 数组名[数字(包含了几个元素)]={元素,元素,元素,元素....}
int ar [ 7 ] = {0,1,2,3,4,5,6,7}
↑ ↑ ↑ ↑
数组类型 数组名 元素数量 元素
二维数组:数组类型 数组名[行数][列数]=[{},{},{}.....]
int ar [2][3] = {{0,1,2},{10,11,12}};
↑ ↑ ↑ ↑ ↑
数组类型 数组名 排 列 元素
指针的定义:值为内存地址的变量。通常用于指向同类变量的地址。
格式:
指针类型 *指针名;
int *b;
↑ ↑
指针类型 指针变量名
指针运算的使用
取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。
//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);
#include<stdio.h>
int main()
{
int a=20,b=10;
int *x,*y;
x=&a;
y=&b;
printf("占用空间为%d,地址为%#p\n",sizeof(a),&a);
printf("占用空间为%d,地址为%#p\n",sizeof(b),&b);
printf("a=%d,b=%d\n",*x,*y);
printf("a的地址为%#p,b的地址为%#p",x,y);
return 0;
}
输出结果为
其中x=&a,y=&b起到了将a,b的地址分别赋给x,y,同时也将a,b的值赋给了*x,*y。
打个比方:
去酒店订了两个房间a,b,门牌号暂时用 x、y 表示
让 10 住进 x,让 20 住进 y
其中门牌号就是 x、y 就是变量的地址
a 和 b 在这里可以理解为具体的房间,房间 a 的门牌号(地址)是 x,房间 b 的门牌号(地址)是 y。而 20 和 10,通过x、y 两个门牌,找到房间,住进 a、b。
由于计算机的硬件指令依赖地址,指针把程序员想要表达的指令以机器的形式表达。因此使用指针的程序更有效率,尤其是处理数组时。
指针数组
定义:是指一个数组里面装着指针,也即指针数组是一个数组,内含指针
int *a[10]; //指针数组的定义形式;
使用
#include <stdio.h>
int main(){
int a = 16, b = 932, c = 100;
//定义一个指针数组
int *arr[3] = {&a, &b, &c};//存放a,b,c的地址
//parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
//arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
int **parr = arr;
printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
return 0;
}
数组指针
定义:是指一个指向数组的指针,它其实还是一个指针,指向数组的指针
int (*p)[10]; //其中,由于[]的优先级高于*,所以必须添加(*p).
使用
一维数组
int main()
{
char a[5]={'A','K','C','G','L'};
char (*p)[5]=&a;//&a代表的是整个数组的首地址
//char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
return 0;
}
二维数组
#include <stdio.h>
int main()
{
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
int(*p)[4];//p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。
int i,j;
p=a;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("%d ",*(*(p+i)+j));//*(*(p+i)+j)表示第 i 行第 j 个元素的值。
printf("\n");
}
/*
0 1 2 3
4 5 6 7
8 9 10 11
*/
return 0;
}