初始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;
}