指针的本质

变量回顾

  • 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?

思考

下面的程序输出什么?为什么

int i = 5;
int* p = &i;

printf("%d,%p\n",i,p);
*p = 10;
printf("%d,%p\n",i,p);

*号的作用

  • 在指针声明时,*号表示所声明的变量为指针
  • 在指针使用时,*号表示取指针所指向的内存空间中的值

例子1:指针使用分析

#include<stdio.h>

int main()
{
    int i = 0;
    int* pI;
    char* pC;
    float* pF;

    pI = &i;
    *pI = 10;
    printf("%p,%p,%d\n",pI,&i,i);
    return 0;
}

传值调用和传址调用

  • 指针是变量,因此可以声明指针参数
  • 当一个函数体内部需要改变实参的值,则需要使用指针参数
  • 函数调用时实参数将复制到形参
  • 指针适用于复杂数据类型作为参数的函数中

例子2:利用指针交换变量

#include<stdio.h>
int swap(int* a,int* b)
{
    int temp = *a;
    *a = *b;
    *b = *a;
}

int main()
{
    int a = 5;
    int b = 4;
    printf("a = %d,b = %d\n",a,b);
    swap(&a,&b);
    printf("a = %d,b = %d\n",a,b);
    return 0;
}

常量与指针

const int* p; // p可变,p指向的内容不可变
int const* p; // p可变,p指向的内容不可变
int* const p; // p不可变,p指向的内容可变
const int* const p; // p和p指向的内容都不可变

小结

  • 指针是C语言中一种特别的变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中的任意地址内容

原文地址:https://www.cnblogs.com/yanyun888/p/9213153.html

时间: 2024-11-06 09:52:32

指针的本质的相关文章

数组与指针的本质

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

C++中this指针的本质

一直以来对C++中的this不理解,只知道在构造函数中,如果构造函数的参数和类成员的名字一样的话,就可以用this指针来区分,如: this->a = a; 一直以来都有这个疑问:this究竟是什么?我们明明没有定义这个this,但是我们可以直接用而编译器不会报错.今天来解决这个疑问. 从刚才的代码中,我们用"this->"而不是"this."就说明this是一个指针,而我们知道,在C.C++中,指针就是地址,因此很容易想到,this也是一个地址.但是问

指针的本质:表示内存地址的数据类型

在典型的32位平台上,可以把内存空间看成是由很多个连续的小房间构成的,每个 房间就是一个小存储单元,大小是1个字节,房间中住着数据.有的数据比较小,比如一个char类型的字符,它只需要一个房间就够了.而有的数据比较大,就 需要占用好几个房间,比如一个int类型的整数,其大小是4个字节,需要4个房间才可以安置.为了方便找到住在这些房间中的数据,房间就需要按照一定的规 则编号,这个编号,就是通常所说的内存地址.这些编号是用一个32位的二进制数来编码的,比如0x7AE4074B.0xFFFFFFFF等

C++:不同类型的指针的本质与差异

转自:http://blog.csdn.net/richerg85/article/details/10076365 指针的类型(The Type of a Pointer)            一个指向ZooAnimal(一个类)的指针是如何与一个指向整型的指针或者指向template Array的指针有所不同?   ZoolAnimal *px; int *pi; Array< String > *pta;        以内存需求的观点来说,没有什么不同.以上三种类型都有足够的内存来放

指针的本质分析

*号的意义 在指针声明时,*号表示所声明的变量为指针 在指针使用时,*号表示取指针所指向的内存空间中的值 指针是变量,因此可以声明指针参数 当一个函数体内部需要改变实参的值,则需要使用指针参数 函数调用时实参值将复制到形参 指针适用于复杂数据类型作为参数的函数中 const int* p; //p可变,p指向的内容不可变 int const* p; //p可变,p指向的内容不可变 int* const p; //p不可变,p指向的内容不可变 const int* const p; //p和p指向

C++学习笔记----2.4 C++引用在本质上是什么,它和指针到底有什么区别

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

值传递,指针传递;引用传递(c++独有)本质

要理解值传递.指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量.栈),内存的布局以及指针和引用的特点.这里主要总结三种参数传递方式使用的主要场合. 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递. 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销.如果需要改变指针本身,可以使用二重指针或者指针引用. 引用传递:除了提供输入值外,还返回操作结果,无需复制开销. #include<stdlib.h> //值传递,函数体内变量n是参数

c指针-专题

六---指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为[字节]/byte,许多现代机器上,每个字节包含8个位.更大内存单位[字],通常包含2个或4个字节组成. 一个字包含4个字节,它的地址是什么? 他仍然只有一个地址,是最左边还是最右边的那个字节的位置,取决于机器. 机器事实-关于整型的起始位置: 在要求边界对齐(boundaryalignment)的机器上,整型存储的起始位置只能是某些特定的字节,通常是2或4的倍数. 变量名和地址关系? 所有高级语言的特性之一,就是通过名字而