19.初始C语言指针

1.指针的认识

  • 指针 = 地址

    //int   a  = 10;
    //类型  变量名  内存地址  值
    1.变量名直接访问
    
    2.通过地址访问
    	&:取地址运算符
    	* :将地址内的值读取出来的运算符
    
  • 指针变量=存放地址的变量

  • #include <stdio.h>
    
    int main(){
    	int a = 10;
    	//通过变量名直接访问
    	printf("%d\n",a);
    	
    	//通过地址进行访问
    	printf("a的地址是:%p\n",&a);
    	
    	//通过地址进行取a的值
    	printf("a=%d",*(&a));
    	return 0;
    }
    

2.指针变量的引入

  • 定义指针变量

    *的标识符作用:只产生指针变量定义或声明的时候

  • 使用指针变量

    *的运算作用:把后面跟的内存地址中的数据取出来

  • 变量访问的两种方式

    • 通过变量名直接访问
    • 通过指针间接访问
      在这里插入图片描述

3.指针变量的类型

#include <stdio.h>

int main(){
	int a = 0x1234;
	int *p = &a;
	char *c = &a;
	//不管是int类型还是char型
	//我们都可以拿到相同的地址
	//在Linux下运行不会报错,在window下会报错
    
    //在window下运行,要进行类型转换
    //char *c = (char *)&a;
	
	//都可以拿到相同的地址
	printf("p=%p\n",p);
	printf("c=%p\n",c);
	
	
	//取值运算符会根据指针变量类型来访问不同的空间大小
	printf("a=%x\n",*p);
	printf("c=%x\n",*c);	
}

4.指针的应用场景1

//进行TEST函数封装的时候
//main函数调用的时候发生了值拷贝
//也就是通过函数名直接访问,但是会有bug
//原因如下
//1.虽然main函数里面的变量名和TEST函数里面的变量名一样
//2.但是两个函数里面对应变量名的地址不一样

#include <stdio.h>

void change(int *data1,int *data2){
	int temp;
	temp   = *data1;
	*data1 = *data2;
	*data2 = temp;
	
}
int main(){
	int data1 = 10;
	int data2 = 20;
	printf("交换前:data1 = %d,data2 = %d\n",data1,data2);
	
	change(&data1,&data2);
	printf("交换后:data1 = %d,data2 = %d\n",data1,data2);
}

5.指针的应用场景2

#include <stdio.h>

int main(){
	int a = 10;
	printf("adress is %p\n",&a);
	volatile unsigned int *p  = (volatile unsigned int *)0x0061FE33;//整数强转为地址
	printf("p=%p\n",p);//特定的位置存放地址
	return 0;
}
//volatile:防止编译器自动优化内存地址

6.作业

封装函数来实现三个数从小到大的排序

#include <stdio.h>  
  
// 交换两个数的值  
void swap(int *a, int *b) {  
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  
  
// 排序函数,按照从大到小的顺序对三个数进行排序  
void sort_descending(int *a, int *b, int *c) {  
    if (*a < *b) {  
        swap(a, b);  
    }  
    if (*b < *c) {  
        swap(b, c);  
    }  
    if (*a < *b) {  
        swap(a, b);  
    }  
}  
  
// 输出三个数的函数  
void print_sorted(int a, int b, int c) {  
    printf("%d %d %d\n", a, b, c);  
}  
  
// 主函数  
int main() {  
    int a, b, c;  
  
    // 输入三个数  
    printf("请输入三个数(用空格分隔): ");  
    scanf("%d %d %d", &a, &b, &c);  
  
    // 调用排序函数进行排序  
    sort_descending(&a, &b, &c);  
  
    // 调用输出函数,打印排序后的结果  
    print_sorted(a, b, c);  
  
    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值