一.一级指针
1.1一级指针的定义
1.2元素通过指针如何访问(解引用)
1.3typedef类型重命名
1.4传值和传址
二.指针的操作
2.1指针+-整型
2.2一级指针和const结合
2.3指针与字符串
一.一级指针
指针:地址的别名
1.1指针的定义
基类型 :取决于变量的类型
什么类型的变量就用什么类型的指针指向(一般)
指针类型 指针名 = &变量名;
int main(){
int a=10;
int *p=&a;//地址类型 变量名 =& 要保存地址的变量
}
如上图所示,a为整型类型,那么指向a的指针的基类型就是int,所以定义该指针就是int*p=&a;
int main(){
int a=10;
int *p=&a;
int* *q=&p;
}
如上图所示,p的类型是指针类型,所以定义指向p的指针类型的基类型就是 int* 所以定义该指针就是 int* *q=&p;
1.2元素通过指针如何访问
*p:通过解引用获取到a的值
通过p 找到a
int *p=&a;//一级指针
int*(基类型) *q=&p;//二级指针,保存了一级指针的地址
1.3typedef :对类型重命名
我们先来看两段代码
int main() {
int a = 10, b = 10;
a = 20;
b = 30;
}
代码一是正确的,a和b的类型都是int
int main() {
int a = 10, b = 20;
int* p, q;
p = &a;
q = &b;
}
代码二是错误的,这里p的类型是指针类型,而q的类型是整型
所以为了方便我们连续定义多个指针变量,我们可以使用typedef去定义一个指针类型,如下图所示
typedef char* PChar;
int main(){
PChar a1,a2;
}
有很多宝子在学完宏定义后可能会想使用宏定义的方式去实现类型定义,这个想法是error
#define Pchar char*
int main() {
char b = 'a';
char a = 'c';
Pchar p1 = &a, p2 = &b;
printf("%c,%c", *p1, *p2);
}
用char*去替换Pchar得到的和我们前面所说的错误是一样的,我们一般使用宏定义去保存我们的数组长度。
1.4形参修改实参的值,传指针解引用
我们以交换值为例
第一个:
void swap(int a,int b){
int temp=a;
a=b;
b=temp;
}
int main(){
int a=1,b=2;
swap(a,b);
printf("a=%d,b=%d",a,b);
}
温馨提示:栈上实行该操作
图示:
通过 普通函数 通过swap函数进行完交换,栈释放,因为是两个操作区,实际上并没有影响我们主函数两个值的互换。
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
int main(){
int a=1,b=2;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
}
图示
代码在时心中,在栈上通过*a解引用访问主函数中的a,*b解引用访问主函数中的b,将a,b的值进行了互换
void swap(int *a,int *b){
int *temp=a;
a=b;
b=temp;
}
int main(){
int a=1,b=2;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
}
这个代码虽然也使用指针去改变值,并没有解引用,但是当代码实现完成后,栈释放后,只是改变了函数中值的地址,并没有改变值,类似于第一个普通函数的交换
二.指针的操作
2.1指针加减整型
2.1.1数组名的含义:数组首元素的地址
int *p=&arr[0];
int*p=arr;
p+1--->意思是p+n*sizeof(基类型) p偏移几个单元格
*p=arr[0] *(p+1)=arr[1];
指针的基类型 决定了加n的能力
2.1.2判断windows上存储数据的大小端
栈在内存开辟的时候
大端:高地址位置存放低位数据,低地址位置存放高位数据
小端:高地址位置存放高位数据,低地址位置存放低位数据
int main() {
int a = 0x12345678;
char* p = (char*)&a;
if (*p == 0x78) {
printf("小端");
}
if (*p == 0x12) {
printf("大端");
}
}
结果:
这个时候p++:意思就是p指向0x56的地址
一级指针和const结合
这块我们主要通过画图分析
int main() {
const int a = 10;
int* p = &a;
}
int *p通过对p的解引用来改变a的值,但是a的值不能改变,所以是错误的
int main() {
const int a = 10;
const int* p = &a;
int const*p = &a;
}
通过固定*p的取值来防止a的值改变
小试牛刀
int main() {
const int a = 10;
const int b = 20;
int* const p = &a;//1
const int* const q = &a;//2
const int* s = &b;//3
s = &a;//4
*s = 2;//5
int* const t = &a;//6
t = &b;//7
*t = 1;//8
}
这里面哪个是对的哪个是错的,我们下期公布答案