20210801pointer2

本文详细介绍了C语言中的指针操作,包括指针加减整数、指针减指针、指针的关系运算以及指针在数组和二级指针中的应用。通过示例代码解释了指针如何在内存中移动、计算元素个数以及如何通过指针访问和修改变量的值。此外,还探讨了指针数组和数组指针的概念。
摘要由CSDN通过智能技术生成

指针运算
//
指针加减整数
指针 -(减) 指针
指针的关系运算


指针加减整数
//#include<stdio.h>
//int main()
//{
//    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//    int i = 0;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int* p = arr;
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ",*(p+i));// 1 2 3 4 5 6 7 8 9 10
//    }
//    printf("\n");
//    for (i = sz-1; i >= 0; i--)
//    {
//        printf("%d ", *(p + i));//10 9 8 7 6 5 4 3 2 1
//    }
//    return 0;
//}

//
指针 -(减) 指针

//#include<stdio.h>
//int main()
//{
//    char ch[5] = { 0 };
//    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//    printf("%d\n",&arr[9] - &arr[0]);//指针 - 指针  得到是指针和指针之间( &arr[0]~&arr[9] //左开右闭区间)的元素的个数
//    //  输出为 9
//
//    printf("%d\n", &arr[9] - &ch[0]);//这种写法error,因为指针减指针,两者必须是同一块空间里的。
//    return 0;
//}


//#include<stdio.h>
//int my_strlen(char* arr)
//{
//    char* start = arr;
//    char* end = arr;
//    while (*end !=  '\0')//循环结束后 end == '\0' == arr[3]
//    {
//        end++;
//    }
//    return end - start;//arr[3] - arr[0]  左开右闭
//    // 第四个元素减去 第一个元素 == 3
//}
//
//int main()
//{
//    char arr[] = "bit";
//    int len = my_strlen(arr);
//    printf("%d\n",len);
//    return 0;
//}


指针的关系运算

//#define N_VALLUES 5
//#include<stdio.h>
//
//int main()
//{
//    float values[N_VALLUES];
//    float *vp;
//    // 1.优先(priority)
//    for (vp = &values[ N_VALLUES/* 5 */ ] /*第六个元素*/; vp > &values[0]/*指针是可以比较大小的*/ ;  /*省略了*/ )
//    {           //允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较;
//
//        *--vp = 0;// 省略部分在这
//    }
//
//     2.
//    //for (vp = &values[N_VALLUES-1]; vp >= &values[0];vp--)//C语言的标准,并不保证它能运行
//         //不允许与指向第一个元素之前的那个内存位置进行比较 
//
//    //C语言标准规定:
//    //允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较;
//    //但不允许与指向第一个元素之前的那个内存位置进行比较 
//
//    //{
//    //    *vp = 0;// 省略部分在这
//    //}
//    return 0;
//}


指针和数组

数组

//#include<stdio.h>
//int main()
//{
//    int arr[10] = { 0 };
//    printf("%p\n",arr);//打印首元素地址
//    printf("%p\n", &arr);//打印数组的起始地址
//    printf("%p\n", &arr[0]);//打印首元素地址
//    //在绝大部分情况,数组名表示是首元素地址
//    //但有两种情况例外
//    // &数组名,arr代表的是整个数组的起始地址。
//    //sizeof(数组名),arr代表的是整个数组,sizeof计算的是整个数组的大小,单位byte
//
//    printf("------------------------\n");
//    printf("%p\n", &arr[0]); // 00F3F8E8 首地址
//    printf("%p\n", &arr[0] + 1);//00F3F8EC加了4字节,因为数组元素类型 int
//
//    printf("%p\n", &arr);// 00F3F8E8 数组的起始地址
//    printf("%p\n", &arr + 1);// 00F3F910 加了40字节(2 * pow(16,1) + 8 * pow(16,0)),
//                           //即跳过一个数组
//
//    return 0;
//}

指针

//#include<stdio.h>
//int main()
//{
//    int arr[10] = { 0 };
//    int* p = arr;// 指针变量p 存的是 arr首地址
//    int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        printf("%p........%p\n",p+i/*根据数组首元素地址找到我们想要打印的元素地址*/,&arr[i]);// 两者是等价de
//                             //如果输出是 %d 型,输出元素,需要解引用操作符* 
//                             //例: *(p+i) 或者 &arr[i]
//    }
//    return 0;
//}


二级指针、

//#include<stdio.h>
//int main()
//{
//    int a = 10;
//
//    //pa 一级指针变量,变量的创建,需要在内存中开辟空间
//    int * pa = &a;//一级指针类型 ;最右边的*,告诉我们 pa 是一个指针
//             // 而int,告诉我们 pa 指向的那个对象的类型为 int
//
//    int* * ppa = &pa;// 二级指针    最右边的*,告诉我们 ppa 是一个指针
//             // 而int*,告诉我们 ppa 指向的那个对象的类型为 int*
//
//    int** * pppa = &ppa;// 三级指针 最右边的*,告诉我们 pppa 是一个指针
//             // 而int**,告诉我们 pppa 指向的那个对象的类型为 int**
//
//    // n 级指针,可按照上表达式的规律写出
//
// //二级指针使用方法
//    printf("%d\n", **ppa);//*ppa == pa ; *(pa)= a ;**ppa == a
//         // 上下两个表达式 输出为 10
//    printf("%d\n", a);
//
//
//    **ppa = 20;
//    printf("%d\n", **ppa); 
//    printf("%d\n", a);//两个表达式输出 是 20 
//    return 0;
//}

指针数组 -  本质上是一个数组 :就是 数组是主语(subject), 指针是个形容词(adjective)
 指针数组 是 存放指针 的数组    //整形数组 - 存放整形 // 字符数组 - 存放字符
#include<stdio.h>
int main()
{
        int a = 10;
        int b = 20;
        int c = 30;
     // int* a = &a;
     // int* b = &b;
     // int* c = &c;

        int* arr2[3] = { &a,&b,&c };//它就是一个指针数组
        int i = 0;
        for (i = 0; i < 3; i++)
        {
            printf("%p\n", arr2[i]);
            printf("%d\n", *(arr2[i]));
            printf("\n");
        }
        
        return 0;
 }
数组指针 - 本质上是一个指针:就是 指针 是主语(subject), 数组是个形容词(adjective)

//int* p[5];
//是一个大小为5且存放整形指针的数组

//int(*p)[5];
//数组指针 通过指针和解引用数组,p先*与结合,说明p不是数组,指向一个大小为5的数组,所以int(*p)[5]即为一个数组指针
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark And Grey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值