【C语言】指针

来源:互联网 发布:布鲁特斯的心脏 知乎 编辑:程序博客网 时间:2024/05/21 06:27

50、指针变量用来记录地址数据

51、只有记录了有效地址的指针变量才可以使用

52、声明指针变量时需要在变量名称前写*

53、指针变量名称前加*可以表示指针所捆绑的存储区

54、指针也是分类型的,不同类型的指针适合与不同类型的存储区捆绑

55、可以在一条语句里声明多个同类型的指针变量,每个指针变量名称前都需要单独加*

56、没有记录有效地址的指针可以分成两类

• 1.空指针里面记录空地址(NULL),这个地址的数值就是0
• 2.其它没有记录有效地址的指针叫野指针

57、程序里禁止出现野指针

58、程序里的所有指针变量必须初始化

59、指针初始化的时候*没有参与赋值过程

60、程序里一个指针可以在不同的时候和不同的存储区捆绑

61、这个时候可以把指针看作是变量的某种特征或身份

62、如果指针记录了数组里第一个存储区的地址就可以通过这个指针找到数组里的每个存储区

63、指针后加下标就可以表示数组里的存储区

64、地址数据可以参与如下几种计算:

• 地址 + 整数
• 地址 - 整数
• 地址 - 地址
65、地址加减整数n实际加减的是n个捆绑存储区的大小

66、数组里第一个存储区的地址加下标可以得到下标对应存储区的地址

67、可以采用如下方法表示数组里下标为num的存储区

*(arr + num)
其中arr代表数组名称

68、地址减地址结果是一个整数,这个整数表示两个地址之间包含的捆绑存储区个数

69、声明指针变量的时候可以使用const关键字

70、如果声明指针变量时把const关键字写在类型名称前就表示不可以通过这种指针对它捆绑的存储区做赋值,但是可以对指针本身做赋值

71、如果声明指针变量时把const关键字写在指针变量名称前就表示可以通过这个指针对它捆绑的存储区做赋值但是不可以对指针本身做赋值

72、声明指针变量的时候可以使用void作为类型名称,可以把这种指针叫做无类型指针

73、这种指针可以和任意类型的存储区捆绑

74、无法通过这种指针知道捆绑存储区的类型

75、不应该在这种指针前直接加*也不应该对这种指针做加减整数的计算

76、这种指针必须首先强制类型转换成有类型指针然后才能使用

77、所有跨函数使用存储区都是通过指针实现的

78、数组做形式参数的时候真正的形式参数就是一个指针

79、声明指针形式参数的时候尽量在类型名称前加const关键字

80、无类型指针通常作为形式参数使用

/* * 指针演示 * */#include <stdio.h>void exercise_1(void) {    int arr[] = {4, 2, 3, 4, 5};    int num = 0;    int *p_num = arr; //数组名称就是数组的地址,所以可以直接用数组名称对指针进行初始化    for(num = 0; num <= 4; num++) {        printf("%d ", arr[num]);        printf("%d ", p_num[num]);    }}void exercise_2() {    int arr[] = {4, 2, 3, 4, 5};    printf("arr是%p\n,arr+1是%p\n,arr-1是%p\n", arr, arr + 1, arr - 1);// 地址运算所加减的数的大小是所绑定存储区的大小。    printf("*(arr+3):%d\n*arr+3:%d\narr[3]:%d\n", *(arr + 3), *arr + 3, arr[3]);//使用*(arr+num)可以得到数组中的内容    // *arr+3的值是先区数组第一个数,然后再加3,*(arr+3)的值是取数组第4个    printf("(arr+3)-arr:%d\n", (arr + 3) - arr);//地址相减是个整数}void exercise_3() {    int num = 0;   const int *p_num = &num;//    *p_num = 10; //声明指针时加上const关键字后就不能对该变量进行赋值了    p_num = NULL; //可以对指针本身做赋值}void exercise_4() {    int num = 0;    char ch = 'a';    float fnum = 4.3f;//    void *p_v =&num;//void 类型的指针可以和任意类型的存储区捆绑,这种指针无法进行*运算,也无法进行加减整数的运算,要想使用必须进行强制转换为有类型的//    *p_v = &ch;//    *p_v = &fnum;}void print(const int *arr, int size) { //声明指针形参时,尽量在类型前加 const关键字   int i = 0;    for(i = 0; i <= size - 1; i++) {        printf("%d", *(arr + i));    }}/* * 编写函数,可以显示调用函数中任意类型存储区的内容 * 无类型指针作形参 * */void exercise_5(void *p, int type) {    if(!type) {        printf("%d", *(int*)p);    }    else if(type == 1) {        printf("%c", *(char*)p);    }    else if(type ==2) {        printf("%g", *(float*)p);    }}int main() {//    exercise_1();//   exercise_2();//    exercise_3();//    int arr[] = {1, 2, 3, 4, 5};//    int size = 5;//    print(arr,size);    int num = 10;    char ch = 'a';    float fl = 4.7f;    exercise_5(&num, 0);    exercise_5(&ch, 1);    exercise_5(&fl, 2);    return 0;}
 /*  * 用指针实现对数组元素的赋值和显示  * */ #include <stdio.h> int main() {     int arr[5] = {0};     int *p_arr = arr;     int i = 0;     for(i = 0; i <= 4; i++) {         *p_arr = i + 1;         p_arr++;     }     p_arr = arr;  //因为上面赋值已经使指针指向了数组最后一个,所以在进行显示    时还需要返回     for(i = 0; i <= 4; i++) {         printf("arr[%d]=%d\n", i, *(p_arr + i));     }     return 0; }
/* * 指针变量演示 * */#include <stdio.h>void exercise_1() {    int num = 0;    int *p_num;  //声明了一个指针变量, 建议在名称前加p做开头    p_num = &num; //为指针变量赋值    *p_num = 10;   //指针变量前加*可以表示该指针所指向的地址    printf("num 的值是%d\n", num);}/* * 键盘输入3个数,把他们从小到大顺序输出到屏幕; * */int exercise_2(int *p_a, int *p_b, int *p_c) {   int tem = 0;    if(*p_a < *p_b) {        tem = *p_a;        *p_a = *p_b;        *p_b = tem;    }    if(*p_b < *p_c) {        tem = *p_b;        *p_b = *p_c;        *p_c = tem;    }    if(*p_a < *p_c) {        tem = *p_a;        *p_a = *p_c;        *p_c = tem;    }}/* * 利用指针和异或交换 * */int exercise_3(int *p_a, int *p_b, int *p_c) {    if(*p_a < *p_b) {        *p_a = *p_a ^ *p_b;        *p_b = *p_a ^ *p_b;        *p_a = *p_a ^ *p_b;    }    if(*p_a < *p_c) {        *p_a = *p_a ^ *p_c;        *p_c = *p_a ^ *p_c;        *p_a = *p_a ^ *p_c;    }    if(*p_b < *p_c) {        *p_b = *p_b ^ *p_c;        *p_c = *p_b ^ *p_c;        *p_b = *p_b ^ *p_c;    }}/* * 改变指针内的内容,返回函数中时还是没有变的 * */int exercise_4(int *p_a, int *p_b, int *p_c) {    int tem = 0;      int *p_tem = &tem; //在交换指针内容时,中间变量也得是指针变量    if(*p_a < *p_b) {        p_tem = p_a;        p_a = p_b;        p_b = p_tem;    }    if(*p_b < *p_c) {        p_tem = p_b;        p_b = p_c;        p_c = p_tem;    }    if(*p_a < *p_c) {        p_tem = p_a;        p_a = p_c;        p_c = p_tem;    }    printf("函数中:%d %d %d", *p_c, *p_b, *p_a);}int main() {//    exercise_1();    int a = 0, b = 0, c = 0;    int *p_a = &a, *p_b = &b, *p_c = &c;    printf("请输入3个整数:");    scanf("%d%d%d", p_a, p_b, p_c);//指针里存放的就是地址了//    exercise_2(p_a, p_b, p_c);//    exercise_3(p_a, p_b, p_c);    exercise_4(p_a, p_b, p_c);    printf("主函数:%d %d %d\n", c, b, a);    return 0;}
原创粉丝点击