关于C语言的指针

关于C语言的指针

一级指针

指针是什么?

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元

指针:

指针是个变量,存放内存单元的地址(编号)。
指针就是地址, 利用这个地址可以找到指定的数据

指针就是地址, 那么在使用的时候, 常常会简单的说 指针变量为指针
指针变量就是存储地址的变量

#include <stdio.h>
int main()
{
 int a = 10;//在内存中开辟一块空间
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
             //将a的地址存放在p变量中,p就是一个指针变量。
 return 0;
}

+ 指针的大小在32位平台是4个字节,在64位平台是8个字节

二级指针

二级指针就是指向一级指针的指针(n 级指针就是 指向 n-1 级指针的 指针)

二级指针的内存布局
二级指针是经常用到的,尤其与二维数组在一起的时候更是令人迷糊。例如:
char **p;
定义了一个二级指针变量 p。p 是一个指针变量,毫无疑问在 32 位系统下占 4 个 byte。
它与一级指针不同的是,一级指针保存的是数据的地址,二级指针保存的是一级指针的地址。

在这里插入图片描述

对于二级指针的运算有:

int b=20;
*ppa=&b; //等价于pa=&b

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .

**ppa=30
//等价于*pa=30;
//等价于a=30;

指针和数组

1.数组名作为右值的时候,就是第一个元素的地址。

int main()
{
    int arr[3] = {1,2,3};
    int*p_first = arr;
    printf("%d\n",*p_first);  //输出1
    return 0;
}

2.指向数组元素的指针 支持 递增 递减 运算。(实质上所有指针都支持递增递减 运算 ,但只有在数组中使用才是有意义的)

int main()
{
    int arr[3] = {1,2,3}; 
    int*p = arr;
    for(;p!=arr+3;p++){
        printf("%d\n",*p); 
    }
    return 0;
}

3、p= p+1 意思是,让p指向原来指向的内存块的下一个相邻的相同类型的内存块。
同一个数组中,元素的指针之间可以做减法运算,此时,指针之差等于下标之差。

4、p[n] == *(p+n)
p[n][m] == *( *(p+n)+ m )

5、当对数组名使用sizeof时,返回的是整个数组占用的内存字节数。当把数组名赋值给一个指针后,再对指针使用sizeof运算符,返回的是指针的大小
这就是为什么我么将一个数组传递给一个函数时,需要另外用一个参数传递数组元素个数的原因了。

int main()
{
    int arr[3] = {1,2,3};
    int*p = arr;
    printf("sizeof(arr)=%d\n",sizeof(arr));  //sizeof(arr)=12
    printf("sizeof(p)=%d\n",sizeof(p));   //sizeof(p)=4
 
    return 0;
}

指针数组

指针数组是一个存放指针的数组。

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

数组指针

能够指向数组的指针
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n。

&数组名VS数组名

#include <stdio.h>
int main()
{
    int arr[10] = {0};
    printf("%p\n", arr);
    printf("%p\n", &arr);
    return 0;
}

arr是数组名,数组名表示数组首元素的地址
&arr 表示的是数组的地址,而不是数组首元素的地址。
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40

猜你喜欢

转载自blog.csdn.net/weixin_44376146/article/details/87724600