初始C语言指针
- 1.指针的认识
- 2.指针变量的引入
- 3.指针变量的类型
- 4.指针的应用场景1
- 5.指针的应用场景2
- 6.作业
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型
//我们都可以拿到相同的地址
//都可以拿到相同的地址
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;
}