指针

原文地址:https://www.cnblogs.com/liqinglucky/p/pointer.html

在计算机中,数据都是存放于内存单元中。每个内存单元就是数据的存放地址。这样存放地址就指向我们定义的变量,指针就是内存单元的地址。

#include<stdio.h>
void main(void)
{
        int *p1,a=1;
        void *p2;
        printf("a start address:%p\n",&a);
        printf("p1 start address:%p\n",p1);
        printf("p2 start address:%p\n",p2);
        p1=&a;
        p2=p1;
        printf("a  end address:%p\n",&a);
        printf("p1 end address:%p\n",p1);
        printf("p2 end address:%p\n",p2);
        printf("value p1 pointed to:%d\n", *p1);
        printf("value p2 pointed to:%d\n", *((int *) p2));
}

这个程序中,a是变量,变量a的起始地址(即:0x7ffcf23af3ac)为a的指针。p1,p2是存放地址的变量,称为指针变量。如果将a的地址赋值给p1(p1=&a),那p1存放的就是变量a的地址。*p1表示对p1指向的地址存放内容取出的操作。

运行结果:

$ gcc -o an_example an_example.c 
$ ./an_example
a start address:0x7ffcf23af3ac   //每次运行出的地址是不同的
p1 start address:0x7ffcf23af4a0
p2 start address:(nil)
a  end address:0x7ffcf23af3ac
p1 end address:0x7ffcf23af3ac
p2 end address:0x7ffcf23af3ac
value p1 pointed to:1
value p2 pointed to:
1

 结构体指针

#include<stdio.h>
void main(void)
{
    typedef struct
    {
      int *OK;
      int NO;
    }STATE;

    STATE *p1;    STATE p2;
    int a=12;

    printf("p1 OK addr:%p\n",&p1->OK);
    printf("p1 NO addr:%p\n",&(p1->NO));
    printf("p2 OK addr:%p\n",&p2.OK);
    printf("p2 NO addr:%p\n",&p2.NO);
  
    p2.OK=&a;
    p2.NO = 0;

printf(
"p2 OK=%d\n",*p2.OK); printf("p2 NO=%d\n",p2.NO); }

 成员运算符"."和" ->"。区别是,直接引用:p2.成员名,(*p1).成员名,间接引用:p1->成员名。这三种用法是等价的。

运行结果

p1 OK addr:0x400440
p1 NO addr:0x400448
p2 OK addr:0x7ffcaefc12a0
p2 NO addr:0x7ffcaefc12a8
p2 OK=12
p2 NO=0

 将指针传递

#include <stdio.h>
#include <malloc.h>

typedef struct STRC_def{
int i;
int j;
}STRC;


int Func1(STRC * pSTRC);
int Func2(STRC aSTRC);


int main()
{

    STRC * a =(STRC *)malloc(sizeof(STRC));//使用堆内存
    STRC b;//使用栈内存
    a->i=0;//初始化
    a->j=0;
    b.i=0;
    b.j=0;
    Func1(a);//传递指针
    Func2(b);//传递变量
    printf("a: %d %d\nb: %d %d\n",a->i,a->j,b.i,b.j);//结果应该是 a: 1 2 \n b: 0 0
    //因为传递指针使用的是同一个存储位置,而传递变量使用的是内容复制的存储位置
    return 0;
}

int Func1(STRC * pSTRC)
{
    pSTRC->i=1;
    pSTRC->j=2;
    return 0;
}

int Func2(STRC aSTRC)
{
    aSTRC.i=3;
    aSTRC.j=4;
    return 0;
}

运行结果

a: 1 2
b: 0 0

 

posted @ 2023-06-29 08:46  liqinglucky  阅读(19)  评论(0编辑  收藏  举报