指针的含义——指针变量、指针的指针、指针使用的注意

指针其实很容易理解的,其他并不是大家想象的那么神奇,那么难。

一、指针的含义:指针其实就是一个变量,它所存放的不是数据,而是数据在内存中地址。当然指针也可以存放函数(方法)的地址,后面会讲到的。声明指针的关键符是*号,指向地址的关键符是&。

二、指针变量:

例如1:#include <stdio.h>

int main

  {

     int a =10;             //第一一个变量a,赋值为10

    int *p = &a;            //p就是一个指针变量,所指向的就是变量a的地址

    printf("%d\n"  ,  p);      //输出指针变量P所指向该地址的变量a的值

}

例如2通过指针修改变量的值:

#include <stdio.h>

void change(int *a);

int main

  {

     int a =10;             //第一一个变量a,赋值为10

   change(&a);           //p就是一个指针变量,所指向的就是变量a的地址

    printf("%d\n"  ,  a);      //输出指针变量P所指向该地址的变量a的值

}

void chage(int *a)

{

  *a =20;          //通过指针修改a的值

}

三、指针的指针:通过上面介绍的指针含义跟指针变量,对于指针的指针字面上来理解大家应该能懂了吧,下面举个例子:

int mait

{

  int a = 20;             //第一一个变量a,赋值为10

  int *p = &a;            //p就是一个指针变量,所指向的就是变量a的地址

   int **pp = &p;           //pp就是一个指针的指针变量,所指向的就是变量指针变量p的地址(&p表示指针变量p的地址)

printf("%d\n" , **pp)       //输出的值就是a的值

}

输出:20

上面的例子这样写的话你们会更明白  *pp == p;        //指针变量*pp找到指针变量p的存储空间

                 *(*pp) = *p = a;    //指针变量*pp找到所指向地址的值(两者相同)

                 **pp = *p = a;    //指针变量*pp找到所指向地址的值(两者相同)

四、指针使用的三大注意:

①:指针类型只能指向相同类型的数据

错误演示1:

#include <stdio.h>

int main

{

  int *p ;

  double d = 10.0 ;

  p = &d;

  printf("%d\n" , *p);    //不会报错,只会警告!

}

②:指针变量只能存储地址

错误演示2:

#include <stdio.h>

int main

{

  int *p ;

  p = 200;       //p只能存储地址 , 除非200是一个地址

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

}

③:指针变量未经过初始化,不要拿来间接访问其他存储空间

错误演示3:

#include <stdio.h>

int main

{

  int *p ;

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

}

时间: 2024-10-16 12:01:31

指针的含义——指针变量、指针的指针、指针使用的注意的相关文章

你必须知道的指针基础-2.指针的声明和使用及数组和指针的关系

一.计算机知道数据类型吗? 1.1 神奇的数据类型 At first,计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中.But,内存角度没有数据类型,只有二进制:数据以字节(8位二进制)为单位存取.不同数据类型占据不同的字节,例如在32位系统中:int 为4个字节,short为2个字节(下面如未特殊声明,均为32为系统环境下的说明).下面我们看看int类型.short类型和double类型的数字分别在内存中如何存储: ①int类型:99999 由于int类型占4个字节,每个字节

【Xcode学C-4】进制知识、位运算符、变量存储细节以及指针的知识点介绍

一.进制知识 (1)默认是十进制.八进制前面加0.即int num1=015;是13.十六进制前面加0x/0X.即int num1=0xd.结果是13.二进制前面是0b/0B,即int num1=0b1101,结果是13. (2)输出能够是八进制.十进制.十六进制输出.各自是%o.%d.%x,但没有二进制格式直接输出. (3)3位二进制位是0~7,三个3位二进制位就相当于八进制数据.如000001101(二进制的13),我们划分成三个一组000 001 101,再分别换算成十进制的就是0 1 5

征服C指针-C的变量种类

C语言的变量具有区间性的作用域.在开发一些小程序的时候也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的.C语言有如下三种作用域. 1. 全局变量 在函数之外声明的变量,默认地会成为全局变量.全局变量在任何地方都是可见的.当程序被分割为多个源代码文件进行编译时,声明为全局变量的变量也是可以通过关键字extern从其他源代码文件中引用的. 2. 文件内部的静态变量 就算对于像全局变量那样呗定义在函数外面的变量,一旦添加了static,作用域就

const型变量和const型指针

const型变量和const型指针 const型变量 如果在程序中需要经常使用某一常量,可以使用编译预处理命令定义符号常量. eg:#define PI 3.14159 const型变量也是一种定义常量的手段.const型变量是特殊的变量,程序运行过程中不可改变,其他特性和变量一样.定义const变量时必须初始化. eg: const int Max=1000; //int和const位置可以交换. const常量与符号常量的区别: 1)符号常量由预编译器处理,const型变量由变量处理. 2)

(4)风色从零单排《C++ Primer》 变量,引用,指针

从零单排<C++ Primer> --(4)变量,引用,指针   变量的初始化 所谓变量的初始化,指在创建变量的同时给予值. 初始化方法: int units_sold = 0; int units_sold = {0}; int units_sold{0}; int units_sold{0}; long double ld = 3.1415926536: int a{ld}, b = {ld}; //error:narrowing conversion required int c(ld)

结构体变量 和 结构体指针

为什么结构体在声明变量不需要去动态的分配内存,而声明结构体指针后,如果对成员进行操作需要分配内存,或者需要定义. 首先变量的声明与定义: extern int i; //声明,不是定义 int i; //声明,也是定义 编译器会随机分配一个定义给i,这个地址肯定是合法的. 然后指针变量的声明与初始化: int *i; //声明一个指针变量 *i = 3;  //直接将值赋值给i所指向的地址.因为我们未对i进行初始化,所以我们也不知道i到底指向哪.有一点可以肯定的是这个地址不会是存储变量的内存空间

娓娓道来c指针 (0)c语言的梦魇:c指针

(0)c语言的梦魇:c指针 序 c语言中有一个重点:c指针.它也是一个难点.当然,这是一句废话:重点往往也是难点.在c标准中,对指针的定义是这种: 指针的类型是derived from其他类型,也就是说指针的类型是由它指向的类型决定的: 指针是一种reference类型,即引用类型: c指针似乎非常难理解,以至于有人指出:掌握了c指针,就掌握了c语言的精髓.本系列就来聊聊c指针,要想弄懂c指针.光就指针本身进行理解,还不够. 由于指针的本质就一句话:指针就是地址.这句话大多数学过c语言的人都明白

&lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

数组是一个什么玩意: 数组和指针我的理解,有相同之处也有不同之处.因有相同之处,因此一些资料上说,数组和指针本质是相同的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 相同之处: 数组名字和指针名字都代表了一个地址. 如:int num[10];num是数组名.函数开辟了一个存储十个整数类型的空间,而num是他们的首地址. int *p; p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址. 不同之处是,num[10]中的空间位置是在栈中,而

C和指针 第十二章 使用结构和指针

链表是一种常用的数据结构,每个节点通过链或者指针链接在一起,程序通过间接指针访问链表中的节点. typedef struct Node { //指向下一个节点的指针 struct Node *next; int value; } 单链表只可以单向遍历 单链表中插入:第一版 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef struct Node { struct Node *n