15-指针

news/2024/11/16 14:52:20/

15-指针

  • sizeof
  • 运算符&
  • 指针
  • 作为参数的指针
  • 访问那个地址的变量*
  • 指针与数组
  • 数组与指针的区别

sizeof

  • 是一个运算符,给出某个类型或者变量在内存中所占的字节数。
  • sizeof(iint)
  • sizeof(i)
  • printf(“%ld”,sizeof());

运算符&

  • scanf(“%d”,&i);里的&;
  • 获得变量的地址,它的操作必须是变量
  • int i;printf(“%x”,&i);
  • 地址的大小是否与int相同取决于编译器
  • int i ;peintf(“%p”,&i);
  • &不能对没有地址的东西取地址
    eg:&(a+b)、&(a++)、&(++a)、&(a+6)
  • 相邻的变量的地址,相差4个字节,且自上向下分配
  • 数组的地址
    a[10]
    &a ==a== &a[0]
    &a[0]与&a[1]相差4

指针

  • 指针是保存地址的变量
    int* p,q;
    in *p,q;
    这两种写法都表示:p是指针,q 是普通变量
  • 普通变量的值是实际的值
    指针变量的值是具有实际值的变量的地址

作为参数的指针

  • void f(int *p);
  • 在被调用的时候得到了某个变量的地址;
  • int i = 0; f(&i);
  • 在函数里面可以通过这个指针访问外面这个i(通过传入的地址,从而访问地址中的值,如果在函数里改变了这个地址里的值,则外面函数的值被改变

访问那个地址的变量*

  • *是一个单目运算符,用来访问指针的值所表示的地址上的变量
  • 可以做右值,也可以做左值
    int k = *p; //将p指向的值赋给k
    *p = k+1; //将p指向k+1

指针与数组

  • 函数参数表中的数组实际上是指针
    sizeof(a) == sizeof(int*)
    但是可以用数组的运算符[ ]进行运算
  • 以下四种函数原型是等价的:
    int sum (int *ar, int n );
    int sum (int * , int );
    int sum (int ar[ ] , int n );
    int sum (int [ ] , int );
  • 数组变量是特殊的指针
    1.数组变量本身表达地址,所以

int a[10]; int *p = a; //无需用&取地址

2.但是数组的单元表达的是变量,需要用&取地址

a == &a[0];

3.*运算符可以对指针做,也可以对数组做

*a = *p = a[0]; //此处a是数组,p是指针
*a = 25 ;

4.[ ]运算符可以对数组做,也可以对指针做

p[0] == a[0]

5.数组变量可以看作是const的指针,所以不能被赋值
int b[ ] = a; //这种写法是错误的
int *q = a; //这种写法是正确的
//此处a是数组
int b[ ] = int *const b , b是一个常量,不能被改变,也就不能被赋值。也可以这样理解,b已经被定义在本地变量,他的地址已经固定,它被看作指针是指向自己本身的地址,自己本身的地址不能被其他的地址所代替,自然不能指向其他地址;

而第二个式子,此时a 代表数组a 的首地址,将指针q 指向a的首地址,与其相似的*q = *a,的意思是将数组a首地址的值赋给q所指向的地址

数组与指针的区别

下面用一个例子感受两者区别

定义数组:int a[10]; —>按理可看作 int *const a;
定义指针 : int *const p = a —>将指针p 指向a
定义二重指针: int *pa = &a ; int *pp = &p;

  1. 输出数组a 和指针p的地址:
    a = %p , p = %p , a , p
    结果: a = 65FDF0 b = 65FDF0
    //二者都表示a的首地址
  2. 输出数组pa 和指针pp的地址:
    pa = %p , pp = %p , pa , pp
    结果: a = 65FDF0 b = 65FDF8
    //前者指向a,表a的地址;后者指向p,表p的地址
  3. 输出数组pa 和指针pp所指的值:
    *pa = %d , pp = %d , *pa , *pp
    结果
    pa = 43 *pp = 65FDF0
    //前者指向a地址,并访问a地址中的值也就是a;
    后者指向p地址,解引用就是访问p地址存放的值,也就是a的地址
  4. 输出*a 和 *p所指的值:
    *a = %d , *p = %d,*a,*p
    结果:*a = 43 , *p = 43
    前者是直接访问本地的值,而后者是先访问p中存放的a的地址,才得到a的值
  5. sizeof(a) == 20 , sizeof(p ) ==8
    可以看出数组与指针所占的内存大小也不同,原因是数组a自定义所有单元都被分配了空间,而p被分配一个地址的空间

数组变量可以被看作是const的指针
const 指针变量虽然无法被改变,但可以被赋予变量的地址,同时还可以改变指向的变量的值
eg:
int a[3] = {1,2,3};
int *const b = a;
*b = 2;
printf(“a[0] = %d”,a[0]); //结果:a[0] = 2
以上写法是正确的,但是int c[3] = a,此写法是错误的,这是数组与指针不一样的地方.


http://www.ppmy.cn/news/230516.html

相关文章

15.1.5

/* *Copyright(c) 2016.烟台大学计算机与控制工程学院 *ALL rights reserved. *文件名称:text11.cpp *作者:孙超 *问题描述:分别定义Teacher(教师)类和Cadre(干部)类,采用多重 *继承方式由这两个类派生出新…

I love you

题目描述 此时相望不相闻,愿逐月华流照君。 一纸情书,到底蕴含了多少倍的爱情呢? I love you, not only for what you are, but for what I am when I am with you. 输入描述: 共一行:一封若干个字符的情书(大小写不敏…

P1051

直接上代码&#xff01; #include<bits/stdc.h> using namespace std; struct node{string xm;int qm,bj;char xsgb,xbxs;int lws;int ans;int sum; }a[101]; bool cmp(node a,node b){if(a.ansb.ans)return a.sum<b.sum;else return a.ans>b.ans; } int total,n;…

RocketMq和Kafka对比

RocketMq和Kafka对比 kafka高性能原因&#xff1a; 生产者&#xff1a; Kafka会把收到的消息都写入到硬盘中&#xff0c;它绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术&#xff0c;顺序写入和MMFile。 顺序写入&#xff1a; 因为硬盘是机械结构&#xff0c;每…

【07JavaScript变量】JavaScript变量指南:从基础到高级,深入解析变量的奥秘!

JavaScript变量教程 概述 JavaScript变量是用于存储数据的容器。变量可以存储不同类型的值&#xff0c;如数字、字符串、布尔值等。本教程将详细介绍JavaScript变量的定义、赋值、作用域和常见的命名规范。 定义变量 在JavaScript中&#xff0c;可以使用关键字var、let或co…

SpringBootWeb AOP(上)

事务&AOP 1. 事务管理 1.1 事务回顾 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时失败。 怎么样来控制这组操作&…

k2p H大老毛子 padavan 2月20日固件

2020.2月20日的H大的老毛子固件&#xff0c;这里不做过多的说明&#xff0c;请在breed中刷入 解压密码123 下载地址&#xff1a; https://72k.us/file/13909188-423784349 带DRV驱动固件&#xff1a; https://72k.us/file/13909188-423784390

k2p 老毛子纯净版固件

不带任何插件&#xff0c;稳定纯净&#xff0c;来自hanwck大佬的&#xff0c;适合喜欢老毛子的已经怕用官方被强制升级的用户&#xff0c;需要提前刷好breed在breed中刷入&#xff0c;适用于银色A1 A2版本&#xff0c;金色版本不适合。 解压密码123 下载地址&#xff1a;http…