指针学习

ejean / 2023-05-05 / 原文


#include <stdio.h> int main(void) { int a; int* p; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(p)); return 0;
在上面这段代码中,用sizeof的方式显示了int和int*有占据多少字节,验证了指针变量的字节根据系统位数形成,而拿我使用的64位系统举例,输出为8

接下来我们运用p=&a进行取地址,再用p*访问地址中的内容

int main(void)
{
    char a=0x66;
    char* p;

    p = &a;
    printf("%x\n", a);
    printf("%x\n", p);   //p是取地址
    printf("%x\n", *p);  //前面定义了p是指向a的地址,而指针变量*p则是取地址中的内容

    p++;
    printf("%x\n", p);
    return 0;

}

其中p++和p--的使用,可以实现数据类型地址的加减,但是并不是单纯的加1减1,要根据数据类型的字节而定

例如:char占用一个字节,p++实现地址+1

   int占用四个字节,p++实现地址+4

   p--同理

 

数组与指针的关系

数组的等级和指针是一样的,互通的,以下面这段代码举例子

#include <stdio.h>

int main(void)
{
    char a[] = { 0x33,0x34,0x35 };
    char* p;
    p = a;
    printf("p*=%x\n", *p);       //输出33
    printf("(p+1)*=%x\n", *(p+1));//输出34    
    printf("(p+2)*=%x\n", *(p + 2));//输出35

    return 0;

}

可以看到先声明数组a和指针*p,p=a,这里没有用p=&a是因为数组本身就是地址名,a[x]就是取地址中从0开始的第x个数,因此不需要加“&”

在使用指针和数组共通时,*p +1就是输出a数组里的下一个数而非地址。 

 

数据传递

让我们先看普通的值传递

#include <stdio.h>
void fun(int param)
{
    printf("%x\n", param);
}

int main(void)
{
    int a = 0x66;
    fun(a);
    
    return 0;
}

 接下来这段写一个用指针实现寻求数组最大值,在首行Findmax函数中用指针设立一个形参,方便接下来在主函数中把数值传递进来,一定要注重同级传递。

在这段函数中,int* array的等级相当于数组,同数组一样属于指针变量。

int Findmax(int *array,int Count) //设形参,接住主函数的数组
{
    int i;
    int max = array[0];
    for (i = 1;i < Count; i++)  
    {
        if (array[i] > max)   //数组中比大小寻求最大值
        {
            max = array[i];
        }
    }
    return max;
}
int main(void)
{
    int a[] = { 13,4,2,5,6,81 }; 
    int Max;
    Max = Findmax(a, 6);
    printf("Max=%d\n", Max); 
    return 0;
}