首页 > 其他分享 >指针

指针

时间:2023-06-29 09:02:01浏览次数:24  
标签:p2 p1 OK int address printf 指针

原文地址: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

 

标签:p2,p1,OK,int,address,printf,指针
From: https://www.cnblogs.com/liqinglucky/p/pointer.html

相关文章

  • 指针将值传递
    原文地址:https://www.cnblogs.com/liqinglucky/p/pointer_value.html指针#include<stdio.h>voidmsg(int*in,int*out){int*sen;int*rec;sen=in;//send的地址通过in赋值给senrec=out;//recv的地址通过out赋值给rec*rec=*sen;//改变rec存放......
  • 初始C语言(20)指针(2)
    一:野指针1:指针未初始化:#include<stdio.h>intmain(){ int*p;//局部变量未初始化,则被认为是随机值 *p=20; return0;}2:越界访问#include<stdio.h>intmain(){ intarr[10]={0}; int*p=arr; for(inti=0;i<=20;i++)//超出了arr的范围,称为野指针 {......
  • const+指针+引用
       ......
  • JVM之指针压缩
    做java开发的同学一般都比较熟悉JVM,那么关于指针压缩这块内容是不是也了解呢,不熟悉的小伙伴往下看吧。首先说明,本文涉及的JDK版本是1.8,JVM虚拟机是64位的HotSpot实现为准。java对象结构了解指针压缩前,需要先搞懂java的实例对象在JVM虚拟机中内存结构是什么样的。java对象由......
  • CUDA学习详细教程之指针篇
    近期,我在写深度学习相关的C++部署时候,往往想更好的提速,将更多类似矩阵相关的运算交给CUDA处理,以此提高推理速度。然,cuda编程入门较为复杂,想简单对图像预处理,通过指针指向减少host到device时间,或模型预测后device上处理完后,数据在device到host输出结果等,这些将会涉及很多知识。......
  • 关于指针
    学习参考文章链接http://t.csdn.cn/HhSR5前面几篇多次看到把地址作为scanf()的输入参数的用法。例如,函数调用scanf("%d",&n),把输入的值存储到变量n所在的内存单元里。其中&n表示变量n的内存地址或存储位置。这里&称为地址运算符,&是一元运算符,与其他一元运算符有同样的优先级。......
  • go:数组和切片、可变长参数、maps、字符串、指针、结构体、方法、接口
    目录数组和切片数组切片可变长参数maps字符串指针结构体方法接口数组和切片数组#1定义,初始化,使用#2数组是值类型数字,字符串,布尔,数组,都是值类型,真正直接存数据切片,map,指针引用类型,是个地址,指向了具体的值#3数组长度#4循环打印数组#5多纬数组#......
  • C++面试八股文:什么是智能指针?
    C++面试八股文:什么是智能指针?某日二师兄参加XXX科技公司的C++工程师开发岗位第19面:面试官:什么是智能指针?二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。面试官:C++11引入了哪些智能指针?二师兄:三种,分别是sh......
  • C++指针函数
    指针函数指针函数有些像C#中的委托delegate(不知道理解的对不对)。定义函数指针int*compare(int,int);一般简写为typedefint(*compare)(int,int);这样就定义了一个名为compare的函数指针。compare指针类型为:指向返回int类型并带有两个int参数的函数的指针。函数指......
  • C++ 指针形参与引用参数
    指针形参与引用参数指针形参指针作形参时,若在函数中修改指针对象的值,则对应实参的值会对应修改。#include<iostream>usingnamespacestd;voidChange(int*p){*p=400;};intmain(intargc,charconst*argv[]){intvalue=1;int*argsPiont=&va......