指针
1.二级指针
一级指针:存放普通变量的地址
二级指针:存放一级指针的地址
1.1格式
存储类型 数据类型 **变量名
p指向了a,q指向了p也就是p的地址
a的值 | a的地址 | p的地址 |
a | &a | &p |
*p | p | q |
**q | *q |
2.指针和数组
2.1两种访问方式
直接访问:按变量的地址存取变量的值(通过数组名访问)
简介访问:通过存放变量地址的指针访问(通过指针访问)
2.2指针和一维数组
int a[5]={1,2,3,4,5};
int *p=a;
通过数组名直接访问
元素:a[i] *(a+i)
地址:&a[i] a+i
通过指针间接访问
元素: p[i] *(p+i)
地址:&p[i] p+i
2.3++和*的运算方法
++和*是单目运算符
单目运算符从右向左运算
++在在前先++再取值,++在后先取值再加加。
++结合内容则内容加加,++结合的是指针那么则指针加加。
2.4指针和二维数组
例如:
int a[2][3] = {1,2,3,4,5,6};
a是数组名,表示第一行的地址,a+1表示第二行的地址。
在行地址前面加*表示将行地址降级为列地址。
*a: 表示第一行第一列的地址
*a+1: 表示第一行第二列的地址
*(a+1): 表示第二行第一列的地址
*(a+1)+1: 表示第二行第二列的地址
元素:a[i][j] *(a[i]+j) *(*(a+i)+j)
地址:&a[i][j] a[i]+j *(a+i)+j
3.数组指针
3.1定义
本质还是指针,指向的是数组(又称行指针)
3.2格式
存储类型 数据类型 (* 指针变量名)[列数];
例如:
int a[2][3] = {1,2,3,4,5,6}; //a的类型int (*)[3]
int (*p)[3] = a;
p的类型也是 int (*)[3], 运算要3个3个运算
p可以代替a进行元素访问,但是本质不同,p是指针变量,a是地址常量。
访问地址:
&p[i][j]
p[i]+j
*(p+i)+j
访问元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
练习:
有一个班,3个学生,各学4门课,计算总平均分以及输出第n个学生的成绩。
int a[3][4] = {65,55,23,57,52,67,64,80,90,42,75,92};
#include <stdio.h>
int main()
{
int a[3][4] = {65, 55, 23, 57, 52, 67, 64, 80, 90, 42, 75, 92};
int(*p)[4] = a;
int sum = 0;
int n;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
sum = sum + p[i][j];
}
}
printf("%d \n", sum / 12);
scanf("%d", &n);
if (n <= 3)
{
for (int i = 0; i < 4; i++)
{
printf("%d ", p[n - 1][i]);
}
}
else
printf("gun");
printf("\n");
}
3.3大小
sizeof(p) = 8
因为本质还是指针,所以大小都是8字节。 如果32位系统是4字节
4.指针数组
4.1定义
所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。
其本质是数组,里面存放的是指针。
4.2定义格式
存储类型 数据类型 *数组名[元素个数];
指针数组名还是表示该数组的首地址
4.3应用
用于存放普通变量的地址
例如:
int a=10,b=20,c=30;
int *p[3] = {&a,&b,&c};
访问b的值
*p[1] **(p+1)
访问b的地址
p[1] *(p+1)
访问abc的值
*p[i] **(p+i)
访问abc的地址
p[i] *(p+i)
用于存放二维数组中每行的一列的地址(列地址)
例:
int a[2][3]={1,2,3,4,5,6}
int *p[2]={a[0],a[1]};
访问地址:
&p[i][j]
p[i]+j
//例如:p[0]=a[0]=&a[0][0]
//再例如:p[1]+1: p[1]=a[1]=&a[1][0] ==>p[1]+1 = &a[1][1]
*(p+i)+j
//例如:*(p+1)+1: p+1 = &p[1] ==>*(p+1)=p[1]=a[1]=&a[1][0] ==>*(p+1)+1 =&a[1][1]
访问元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
char *p[3] = {"hello", "world","666"};
#include <stdio.h>
int main()
{
char *p[3]={"hello","world","666"};
printf("%s %s\n",p[1],*(p+1));
printf("%s %s\n",p[0],*(p));
printf("%c %c\n",*(p[0]+1),*(*(p)+1));
printf("%c %c\n",*(p[1]+4),*(*(p+1)+4));
}
int main(int argc, char const *argv[])
{
printf("%s\n",argv[0]);
}
argv:就是一个指针数组,里面存放的是命令行传递的字符串
argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串的个数