1:void和大小端
- 不允许修饰普通变量: void a; //错误!!
- 可以修饰指针: void *p; //此时p是一个任意类型的指针
使用场景:函数传参或函数返回值。例如malloc函数的返回值。
注意: 通过void型指针进行取内容时,需要对地址进行强转。
转换方式:
强制转换: (int *) p 为右值。
int a = 10;
void *p = &a; //p数据类型为void *
int *q = (int *)p; //将p转换成int *类型的指针然后赋值给q
printf("%d %d\n", *(int *)p, *q);
1.2:大小端的使用
大端:数据的低位存储在高地址位,数据的高位存储在低地址位,大端字节序称为MSB
小端:据的低位存储在低地址位,数据的高位存储在高地址位,小端字节序称为LSB
2:二级指针
2.1:指针一维数组
int a[5]={1,2,3,4,5};
int *p=a;//等于数组的首地址
2.2:访问方式
2.2.1:数组名直接访问
元素:a[i]或者*(a+i)
地址:&a[i]或者a+i
2.2.2:指针间接访问
元素:p[i]或者*(p+i)
地址:&p[i]或者p+i
int mian()
{
int a[5]={1,2,3,4,5};
int *p=a;
for(int i=0;i<5;i++)
printf("%d%d%d ",a[i],*(a+i),p[i],*(p+i));
}
注释:a和p数值上一样,但是本质不同。
- a是地址常量,p是指针变量。
- a不能执行++操作,但是p可以。
- ++和*是单目运算符
- 单目运算符从右向左运算
- ++在在前先++再取值,++在后先取值再加加。
- ++结合内容则内容加加,++结合的是指针那么则指针加加。
3:指针和二维数组
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
4:数组指针
本质还是指针,指向的是数组。 (又称行指针)
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)
指针数组:(int (*p)[3])
所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。
其本质是数组,里面存放的是指针
存储类型 数据类型 *数组名[元素个数];
指针数组名还是表示该数组的首地址
5.2.1:存放普通变量的地址
int a=10,b=20,c=30;
int *p[3]]={&a,&b,&c}
5.2.2:存放二维数组中的每行第一列的地址
int a[2][3] ={1,2,3,4,5,6};
int *p[2] = {a[0], a[1]}; //或者*a, *(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)
打印字符还是这三个公式:*(p[i]+j) *(*(p+i)+j) p[i][j]
5.2.4:命令行参数
int main(int argc, char const *argv[]){
printf("%s\n",argv[0]);
}
argv:就是一个指针数组,里面存放的是命令行传递的字符串
argc:表示argv指针数组里面存储数据的个数,即命令行传递字符串
int main(int argc, char const *argv[])
{
// printf("%d\n",argc);
// printf("%s\n",argv[1]);
// printf("%c %c\n",*(argv[1]+1),*(*(argv+1)+1));
int num=0;
for (int i = 1; i < argc; i++)
{
for (int j = 0; j < strlen(argv[1]); i++)
{
num=num*10+*(*(argv + 1) + i) - '0';
// printf("\n");
// return 0;
}
}
printf("%d",num);
// printf("%d ", *(*(argv + 1) + i) - '0');
//printf("\n");
return 0;
}