学习c++已经快一年了,最近打算整理一下所学的知识,就当是系统地复习一遍,指针方面包括指针的简单介绍、使用指针常见的错误、指针与数组、指针与函数、指针数组和数组指针。

指针简单介绍

任何刚开始学习c语言的人如果被难住了,那一定是卡在指针这边了,其实指针并没有这么可怕,我这边就挑两个重点来讲了,如下:

1、指针是一种数据类型

2、间接赋值是指针存在的最大意义

第一点是什么意思呢,其实也没啥意思,比如int a=1;float b=1.0;char c='a',这边int是整型,float是浮点型,char是字符型,它们都可以称为是一种数据类型,所以我想说的是指针其实也只是一种数据类型,只不过是专门存放地址的数据类型而已,int a;int *p=&a;首先声明了一个变量a,然后声明了一个int*的变量p,将变量a的地址赋值给变量p,int*就是我想说的那个数据类型,这个数据类型你想怎么写都可以,不过至少要有一个*,int *p1;数据类型int*,存放整型变量的地址,int **p2,数据类型 int**,存放int*变量的地址,这其实就是二级指针了,*的数量是没有限制的,int **....* p100,100个*也是可以的,反正p100的值等于一个地址,这个地址是一个99级指针变量的地址。

第二点,间接赋值是指针存在的最大意义又是什么意思呢。请看下面的代码:

#include <stdio.h>
void main(int argc,char** argv)
{int a=5;int *p=&a;*p=6;printf("%d\n",a);
}

这个程序非常的简单,最后的结果是6,但是这并不能体现出指针存在的意义,我费尽周折改变了a的值,为什么不直接通过a=6的方式来改变呢?请再看下面的程序:

#include<stdio.h>
void swap1(int a,int b)
{int c;c=a;a=b;b=c;
}
void swap2(int*p1,int *p2)
{int c;if(p1&&p2){c=*p1;*p1=*p2;*p2=c;}
}
void main(int argc,char**argv)
{int a=1;int b=2;swap1(a,b);printf("a=%d,b=%d\n",a,b);swap2(&a,&b);printf("a=%d,b=%d\n",a,b);
}

这个程序想交换两个int类型变量的值,首先尝试swap1函数,最后打印的结果是"a=1,b=2",说明交换失败了,为什么呢?因为将a和b传给形参a和形参b,只是将a和b各自的一份拷贝给了形参a和形参b,你怎么使用这份拷贝,不关a和b的事。可是现在我就是想通过函数的形式来交换a和b,那该怎么做?很简单,把变量a和变量b的地址拷贝一份,传给函数,在函数里通过这两个地址访问main函数里的a和b,就像我把我家钥匙给你一把,虽然是拷贝的一把钥匙,但是你照样可以用这个钥匙来打开我家的门,不信的话可以尝试运行这个程序,第二次输出的就是"a=2,b=1",这就是指针能做到其它数据类型做不到的事。

指针类型的大小

在32位操作系统下,每种数据类型都有他对应的大小,因为每种数据类型存储数据的能力是不一样的,那么指针类型的大小是多少呢?只要通过printf("%d",sizeof(TYPE* ));就可以知道了,这里TYPE可以是各种类型,最后我们发现,无论是int*,还是float*,还是int**,打印出来都是4,也就是说指针类型是四个字节,为什么这些不同类型的指针都是四个字节呢,上面也提到了,指针变量就是存放地址的,所以这也就表示32位操作系统下,地址用四个字节表示,那为什么偏偏是四个字节,这和cpu寻址能力有关,因此,32位操作系统和64位操作系统的指针大小是不一样的,想要了解什么是cpu寻址能力的可以看王爽老师写的《汇编语言第2版》(可能有第3版了)的前几个章节,介绍的非常详细。

指针类型的作用

既然不管是什么类型的指针,在32位下都是4个字节,那么还要指针类型做什么,为何不都用void*呢?其实指针的类型主要影响对内存的解析方式,请看下面的代码:

#include<stdio.h>
#include<windows.h>
typedef struct Position
{int x;int y;
}Position, *LPosition;
void main(int argc, char**argv)
{Position p1;LPosition lp1 = &p1;p1.x = 1;p1.y= 2;int a = *((int*)lp1);int b = *(((int*)lp1) + 1);printf("%d %d", a, b);system("pause");
}

如图所示,如果以int*的方式去解析结构体变量的内存,那么一次只会取出四个字节,所以这个程序打印出的是p1.x和p1.y的值。

这篇博客暂时就总结这么多了,如果您发现有什么问题希望能够指出,感激不尽!

c语言指针回顾——指针基础相关推荐

  1. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  2. C语言 const 修饰指针 - C语言零基础入门教程

    目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...

  3. C语言 函数指针和指针函数区别 - C语言零基础入门教程

    目录 一.函数指针和指针函数声明的区别 1.函数指针 2.指针函数 二.函数指针和指针函数调用的区别 1.函数指针的调用 2.指针函数的调用 三.猜你喜欢 零基础 Python 学习路线推荐 : C/ ...

  4. 【C语言】玩转指针——关于指针,你需要掌握的基础知识!

    文章目录 前言 一.指针是什么? 1.数据在内存中的存储 2.一个小的单元到底是多大? 二.指针变量 1.什么是指针变量 2.指针类型 3.指针类型的作用 三.野指针 1.什么是野指针 2.野指针成因 ...

  5. c语言指针指向怎么指,C语言-基础教程-指向指针的指针

    一个指针变量可以指向整型变量.实型变量.字符类型变量,当然也可以指向指针类型变量.当这种指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量,这话可能会感到有些绕口,但你想到一个指针变量的地址 ...

  6. c语言中字符指针变量输入,C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

  7. C语言基础(七)—— 指针、指针变量

    1. 概述 1.1 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分. 内存:内部存贮器,暂存程序/数据--掉电丢失 SRAM.DRAM.DDR.DDR2 ...

  8. 指针01 - 零基础入门学习C语言41

    第八章:指针01 让编程改变世界 Change the world by program 指针啥玩意?似乎很神秘? 指针是C语言中的一个重要的概念,也是C语言的一个重要特色. 正确而灵活地运用它,可以 ...

  9. 指针04 - 零基础入门学习C语言44

    第八章:指针04 让编程改变世界 Change the world by program 小结 归纳起来, 如果有一个实参数组, 想在函数中改变此数组中的元素的值, 实参与形参的对应关系有以下4种情况 ...

最新文章

  1. 万亿级企业MySQL海量存储分库分表设计实践
  2. 车联网系统会不会只是智能手机系统的翻版?
  3. 手机python利器能做什么_推荐一款开发利器!既能写Python,又能写Java
  4. python如何使用字典_python字典怎么使用zip
  5. c语输入单引号_C语言的printf不能用单引号?
  6. Android官方开发文档Training系列课程中文版:通知用户之大视图通知
  7. Python的if条件语句(常用)当为多个判定条件时
  8. 打卡学习 | Redis原理应用-线程IO模型
  9. 学习腾讯的hover效果
  10. 股东接连减持 寒武纪2021年净亏损8.47亿元
  11. 最常用计算机语音,计算机常用词汇--语言及服务器篇
  12. Gstreamer1.16.2与Glib2 signals关键字冲突解决(十一)
  13. H5实现打印电子面单(淘宝菜鸟物流)
  14. Java XLSTransformer生成excel文件
  15. 体表面积在线计算机,体表面积计算器
  16. Tencent QQ/TIM 文件下载漏洞的研究
  17. javascript弹窗和基本数据类型
  18. 线性表2 - 数据结构和算法07
  19. 计算机和人脑在线阅读,人脑与电脑(原文)
  20. cognos 是什么?

热门文章

  1. 怒江java培训班_Graal VM:微服务时代的Java
  2. 推荐系统9---AFM与DIN模型(推荐系统遇上注意力机制)
  3. op反馈电阻并联反馈电容
  4. c#构造函数 例子学习
  5. 批量挖掘SRC思路与实践一
  6. micropython是什么意思_介绍 MicroPython 语言
  7. mysql使用什么语句为指定_在MySQL中,可以使用_____语句来为指定数据库添加用户。...
  8. Redis数据库及五种数据类型的常用命令详解
  9. [Mysql] GROUP BY分组
  10. LuatIDE是什么?