【1】指针和数组
1》直接访问
通过变量的地址存取变量的元素(通过数组名访问)
2》间接访问
通过存放变量地址的变量去访问(通过指针访问)
int a[3] = {1,2,3};
int *p = a;
访问数组a[i]的值:
直接访问:a[i] *(a + i)
间接访问:*(p + i) p[i]
访问数组a[i]的地址:
直接访问:a + i &a[i]
间接访问:&p[i] p + i
注意:
a 和 p本质不同,a 是数组名,是地址常量,不能为左值,p 是指针变量
【2】指针和二维数组
1》直接访问
二维数组的数组名:第一行的首地址
可以降级 降级到第一行第一列的地址 通过 * (解引用)
a :第一行的地址
*a :第一行第一列的地址
*a + 1 :第一行第二列的地址
访问数组元素的地址:
&a[i][j] *(a + i) + j a[i] + j
访问数组元素:
a[i][j] *(*(a + i) + j) *(a[i] + j)
2》间接访问(数组指针)
数组指针:
定义
指向数组的指针,用来存放数组的地址,(本质还是一个指针,行指针)
格式
存储类型 数据类型 (* 数组指针名)[列数];
int a[2][2] = {1,2,3,4};
int (*p)[2] = a; //定义了一个数组指针 p
p:第一行的首地址 p + 1 :第二行的首地址
p + 1 :移动 8 个字节(列数 * 指针的数据类型的大小)
访问数组元素的地址:
&p[i][j] *(p + i) + j p[i] + j
访问数组元素:
p[i][j] *(*(p + i) + j) *(p[i] + j)
数组指针的大小
取决于计算机操作系统的位数
64位 8字节 32位 4字节
【3】指针数组
定义
存放指针的数组,数组中每一个元素都是一个指针(地址),本质是数组
格式
存储类型 数据类型 * 指针数组名 [元素个数]
int *arr_p[5]; //定义了一个指针数组
1》用于存储普通变量的地址
int a = 10, b = 20, c = 30;
int *arr_p[3] = {&a,&b,&c};
访问 a 的地址:arr_p[0]
访问 a 的值 :*arr_p[0]
访问 b 的地址:*(arr_p + 1)
访问 b 的值 : **(arr_p + 1)
2》存放二维数组每一行第一列的地址
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int *p[3] = {a[0],a[1],a[2]};
访问:
第二行第一列的地址:p[1] *(p + 1)
第三行第二列的元素:*(p[2] + 1) *(*(p + 2) + 1)
3》存放多个字符串
char *p[3] = {"hello","world","ak"};
//打印:hello字符串
printf("%s",p[0]);
printf("%s",*p); //p[0]、*p 指向‘hello’字符串的首地址
//打印:k字符
printf("%c",*(p[2] + 1)); //第3行第2列
printf("%c",*(*(p + 2) + 1));
printf("%c",p[2][1]);
【4】命令行参数
int main(int argc,char const *argv[])
{
return 0;
}
argc :字符串的个数 传递的数据个数
argv:指针数组 存放字符串
int main(int argc, char const *argv[])
{
printf("argc=%d argv[0]=%s argv[1]=%s\n",argc,argv[0],argv[1]);
return 0;
}
练习:
输入一个字符串获取字符串中a字符首次出现的下标(指针做)
char a[32] = {};
gets(a);
int len = strlen(a);
char *p = a;
for(int i = 0;i < len;i++){
if(*(p + i) == 'a'){
printf("%d\n",i);
break;
}
}
已知字符数组a[10]和b[10]中元素的值递增有序,用指针实现将两个数组中元素按照递增顺序输出。如:char a[10]=”acdgjmno” ; char b[10]=”befhil”;->”abcdefghijlmnos
char a[10] = "befhil";
char b[10] = "acdgjmno";
char *p = a;
char *q = b;
int m = strlen(a);
int n = strlen(b);
while(*p != '\0' && *q != '\0'){
if(*p > *q){
printf("%c",*q);
q++;
}else if(*p < *q){
printf("%c",*p);
p++;
}
}
if(m > n){
printf("%s",p);
}else if(m < n){
printf("%s",q);
}