指针:
1. 指针基础定义:
int *p 定义一个指针看,这个指针只指向一个整形,
char *p 这个指针只指向一个字符型, 还有 double *p, float *p 等
int *p;
p 表示所指向的对象的地址, *p可以理解成对象本身
#include<stdio.h>
int main(){
int a = 5;
int* p = &a;
printf("p指向的值:%d ,p的值:%d ,a的地址:%d", *p , p,&a);
return 0;
}
执行效果如下
2.定义指针指向一个数组
一维指针:
#include<stdio.h>
int main(){
int a[6]= {1,2,3,4,5,6};
int* p = a;
for(int i = 0; i < 6 ; i++){
printf("p指向的值:%d, ", *(p+i));
}
return 0;
}
执行效果:
*(p+i)) 表示指针向后移动 i 个值,int型占用内存四个字节,所以相当于每次移动四个单位
二维指针:
#include<stdio.h>
int main(){
int a[2][3]= {1,2,3,4,5,6};
printf("%d %d ", a,a+1);
return 0;
}
输出结果
a是而二维矩阵地址 a+i 相当于地址向后移动 i 行,也就是说 结果是:首地址 + i*sizeof(a[0]) ,上题代码中,一行有三个数据,消耗12个字节 ,因此图片中 a 的地址是 6422016 而 a+1 的地址是 6422028 (移动了12个字节单位)
#include<stdio.h>
int main(){
int a[2][3]= {1,2,3,4,5,6};
printf("%d %d %d %d %d %d", *a,a[0],*a+1, a[1]+1, a+1,a);
return 0;
}
执行效果如下:
a 表示第一行第一个地址 , a[0] 表示第一行第一个地址,与a 效果相同 , 而*a+1,表示第一行向右移动一个int的地址(一个int是四字节), a+1表示指针向后移动一行 a[1] + 1 表示第二行同时向右移动一个地址 a 则表示二维矩阵占用内存的起始地址
指针数组:
指针数组 本质是一个数组,只是数组中保存的值是指针(地址),
int *p[ ] 由于[ ] 的优先级比 * 高,实际是 int *(p[ ]),将数组的每一个值定义为int型的指针。
#include<stdio.h>
int main(){
int* a[6]= {6422024,2,3,4,5,6};
printf("%d ", *(a[0]));
return 0;
}
执行结果
将a[6]中的每个值定义为指针,访问a[0],也就是访问地址是6422024的值
数组指针:
#include<stdio.h>
int main(){
int a[3][4]= {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
int (*p)[4] = a;
printf("%d ,%d \n",sizeof(*p),sizeof(*(p+1)));
}
运行结果:
此时p指向的是一个数组,长度为4个int 也就是16个字节,而 *(p+1) 表示移动到下一个单位, 向后移动16字节,指针指向的每一个大小都是16字节
使用数组指针遍历二维矩阵:
#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;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 4; j++){
printf("%d ,%d \n",(*(p+i)+j),*(*(p+i)+j));
}
}
}
运行结果: