菜鸟初识指针

一.一级指针

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

}

这里面哪个是对的哪个是错的,我们下期公布答案

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值