C语言——指针初阶

C语言——指针初阶,第1张

大家好,我是Abert。

指针可谓是C语言的灵魂,这篇文章浅谈指针的概念和用处。

文章目录 1.指针的概念(介绍) 2.内存(简介) 3.指针 *** 作

正文 1.指针的概念(介绍)

指针是一个值为内存地址的变量(或数据对象)。

(指针就是地址,口头上说的指针大多是指针变量)

指针就是地址,那么假设给定一个指针变量pa,用pa存放a的地址,则可以写为  pa = &a(把 a 的地址赋给 pa ,我们也可以理解为 pa “指向” a,当然,pa还可以指向别处,例如 pa = &b)

若要通过 pa 找到 a ,则可以利用 *pa (找出pa指向的值)即可取出 a 。

&是取地址 *** 作符,获得变量(常量)在内存中的地址。

* 是解引用 *** 作符,将指针变量 pa 解引用,即可找到 a。

注意 pa 是指针变量,pa 的类型是 int *        (这里假设a是int类型,如果a是char类型,则pa的类型为char*)

例如:

int main()
{
    int a = 0x11223344;
    int* pa = &a;
    
    printf("%d\n", a);
    printf("%d\n", *pa);
    //对比以上结果,结果相同
}
指针变量的大小是4或8个字节(32位环境下是4个字节,64位环境下是8个字节)

二级指针

二级指针就是存放一级指针地址的指针,大小也是4(8)个字节。

#include 
int main()
{
    int a = 4;
    int *pa = &a;//一级指针
    //接下来定义二级指针
    //二级指针的类型取决于一级指针,一级指针是int*类型,二级指针应为int**类型
    int** ppa = &pa;//存放指针变量pa的地址
    //通过ppa和pa间接找到a的数据
    int* ptr = *ppa;//解引用ppa找到pa放到ptr变量中
    int b = *ptr;//解引用ptr找到a的数据放到b中,此时a == b
    printf("%d ", b);

}

 2.内存(简介)

这个模块简单介绍内存相关内容 

 计算机内存的单位换算

 32位环境下内存大小

不同的指针类型解引用时所能访问的权限也是不同的 

下面讲解指针解引用时访问的权限

指针类型还决定了,指针向前或向后走一步,走多大距离 

 

 3.指针 *** 作

数组名是数组首元素的地址

但是有2个例外:

sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小

&数组名,数组名表示整个数组,取出的是整个数组的地址

通过指针访问数组

#include 
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
                  //0 1 2 3 4 5 6 7 8 9
    int* p = arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", *(p + i));//通过解引用找到数组中的数据
        
    }
    
   return 0; 
}

指针与整数相加(相减)是以字节为单位

递增指针:戴增指向数组元素的指针可以让该指针移动至数组的下一个元素。

(假设有一个指针变量ptr,递增即为 ptr++)

递减指针与递增指针类似

指针与指针之间求差:计算两个指针的差值。

求差的两个指针分别指向同一个空间的不同元素,通过计算求出两元素之间的距离。

|指针 - 指针| 得到的是指针和指针之间的元素个数

下面通过指针减指针实现库函数strlen

strlen可用来求字符串的长度

char [] = " abcdef ";(注意:abcdef后还隐藏了字符\0)

strlen可以求\0之前的元素个数

了解了上面这些,我们来用指针减指针的方式实现我们自己模拟的my_strlen

#include 

int my_strlen(char* str)
{
    char* tmp = str;//记录初始位置
    while (str != '\0')
    {
        str++;//末尾位置
    }
    return str - tmp;//两个指针之间元素的个数
}

int main()
{
    char arr[] = " abcdef ";//6
    int ret = my_strlen(arr);
    
    printf("%d", ret);
    return 0;
}
总结

指针的本质是地址,可以是变量的地址,也可以是指针的地址,大小都为4(8)个字节。

以上就是这篇文章关于初阶指针的内容,欢迎大家学习交流。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存