指针概况

关于指针这一块儿,学起来容易迷,当然也是C语言的重点。下面详细说说指针的类。

指针是特殊的变量,相当于地址,指针里面存储的数据数值实际上就是内存地址。需要考虑四个方面:指针的类型,指针所指的类型,指针的值(地址),指针本身的地址(内存空间)

需要注意的是,指针的类型和指针所指的类型不一样,不可以混为一谈。比如:
int * p;
int *p();
int *p[4];
int (*p)[4];

等等,指针类型可以简单记为去掉指针名称,而指针所指的类型可以简单记为去掉指针名称和名称前面的 *。
比如上面的例子:(指针的类型)
int *
int ()
int * []
int (
)[]
而(指针所指的类型):
int
int ()
int []
int ()[]

联动一下,提到变量要牢记四件事:变量名称、变量类型、变量值以及变量的内存空间。

指针形式

  1. int p; 表明p是一个int型变量
  2. int *p;p先和 *结合,是一个指针,再和int结合,返回的是int数据。表明p是一个返回int数据的指针
  3. int p[];p先和[]结合,是一个数组,再和int结合,返回的是int型数据,表明p是一个返回整型数据的数组
  4. int *p[];p与[]先结合,是一个数组,再与 *结合,数组中的数据类型都是指针类型,再和int结合,数组中每一个指针指向的数据都是int型,表明p是一个由返回整型数据的指针所组成的一个数组
  5. int (*p)[];p先和 *结合,说明p是指针,再和[]结合,说明指针指向的内容是一个数组,()只是为了提高优先级,可以省略分析,再和int结合说明数组里面全部都是int型数据。表明p是一个指向由int型数据组成的数组的指针
  6. int **p;二级指针。好像没怎么考,函数调用用的多。
#include <stdio.h>
int main(){int array[5];int *p = &array;//一级保存array[0]的地址int **pp = &p;//而二级保存p的地址,层层嵌套详细的下面讲
}
  1. int p(int,int);p先与()结合,说明p是一个函数,里面有两个整型参数,再和int结合,说明函数返回的是int型数据。表明p是一个返回int型数据的函数
  2. int *p(int);p先和()结合,说明是函数,函数里面有int参数,再和 * 结合 ,函数的返回类型是指针类型,再和int结合,说明指针指向的都是int型,表明p是一个指针型函数,是返回指向int型数据的指针的函数
  3. int (*p)(int);p先和 * 结合,说明p是指针,再和(int)结合,表明指针指向的内容是带有int参数的函数,再和最外边的int结合,说明返回int数据。表明p是一个指向返回int数据的函数的指针
  4. int *(*p(int))[3];p先和(int)结合,说明是带int参数的函数,再和 结合说明函数返回的是指针类型,再和[]结合,说明指针指向的是一个数组,再和 结合,说明数组的每一项都是指针组成的,再和int结合,说明返回int型数据。表明p是一个指向由返回整型指针所组成的数组的指针

指针运算

  1. 指针通常可以加减运算,但是和普通的数值操作不一样,指针是通过地址的高位或者低位加减来运算的。比如:
#include <stfio.h>
int main(){char arr[20];
char *P = arr;
p++;

这里就是p通过不断地+1,在地址中不断的向高位移动一位,来操作数组中的数据。

  1. 接下来看看这个不能操作的例子:
#include <stdio.h>
int main(){char arr[] = "abcdefghijklmn";
char *p = arr;
char **pp = &p;
pp++;
printf("%c\n",**pp);
return 0;
}

这里有个比较容易错的点,就是pp++之后,p的地址向高位移动8位,那么printf打印的也就是*(&p+8),那么这个地址是不得而知的,有可能是内存中某个数据地址,总之不是我们指定的arr的地址。(关于这个8就是不同类型的大小而已,指针的通常是用8个字节表示一个地址,自己可以用sizeof一下)。

  1. &和*的运算。&是取地址符号, * 是取内容符号
#include <stdio.h>
int main(){int a = 10;
int *p = &a;
printf("%p",&a);//p是打印地址,&a是取出a的地址
//printf("%p",p);一样的效果。printf("%d",*p);//p是一个指针,里面存储a的地址,*p是取出p所指向地址的值。
//int*p这里的*是表明p是一个指针变量,标识符号.表明指针变量,用来保存别人的地址
//*(&a)是读取内存地址的数据return 0;
}

指针表达式

指针的表达式就是正常的指向操作,比如下面的几种写法:
char arr[20];
char *p;
char **pp;

p = arr; pp = &p; p++;这些都是指针的表达式
char * arr[20];
char ** parr=arr; 如果把arr 看作指针的话,arr 也是指针表达式
char * str;
str=* parr; * parr 是指针表达式
str=*(parr+2); *(parr+2)是指针表达式

指针、数组、函数

指针数组:强调数组,数组中的每个元素都是指针类型int * p[4]
[]比 优先级高,所以p先和[4]结合,形成P[4]数组形式,表明p数组中有4个元素再和结合,表明这是指针类型的,每个数组元素都可以指向一个整型变量。写法:类型名 * 数组名[数组长度]

数组指针,强调指针,int (*P)[4] 、float (*pointer)[4]。指向数组的指针,可以跟函数指针一起记

指针函数:int * p 是指针变量,int * p 是变量,为int指针类型。二者表达的意思是相同的。

float (*func)(int param1, int param);
这是一个函数指针的例子,指向一个返回值为float,参数为两个int的函数
因此我们推断上面那个是指向float[4]的指针

float *pointer[4]
指针数组,相当于而二维数组

数组指针 int (*p)[3]
指针数组 int *p[3]
函数指针 int (*getData)(int a,int b)
指针函数 int *p(int x,int y)返回指针类型的参数
函数指针数组 int (*p[3])(int ,int);

学习笔记——指针那些事儿相关推荐

  1. C语言学习笔记——指针章节

    学习小结 c语言指针学习笔记汇总 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//指针 //在计算机科学中,指针是编程语言的一个对 ...

  2. C语言学习笔记---指针

    C语言要玩的好,指针是核心,但是指针在学习的时候看教程往往感觉一看就明白,但是实际用的时候一用就错,而且还不知道错在哪.为了更加深刻的了解指针,将学习过程记录下来,依次加深对指针的理解. 先看看一段测 ...

  3. c语言普通变量间接访问,C语言学习笔记-指针

    野指针问题 野指针是没有指向地址的指针,也就是该指针指向的地址是随机的. 因为指针的指向地址是随机的,所以很有可能指向不可访问的弟子,导致程序崩溃,或者访问了不该访问的地址,导致影响其他功能使用 为了 ...

  4. C语言学习笔记---指针和数组

    数组是相同类型的数据集合,会在内存中占用连续的一块内存.而指针是存储的一个地址,在内存中不会占用连续的内存. 先来写一段测试代码 void fun(void) {int i;int num[10]={ ...

  5. 循环char 指针_c 学习笔记 指针

    1. 使用指针指向数组 int 这种输入方式是错误的,因为数组名代表数组首元素的地址,是一个指针型常量,其值在程序运行期间是固定不变的.所以a++是无法实现的. int a[10]; int *p = ...

  6. C/C++学习笔记-指针数组、数组指针

    指针数组.数组指针 这两者前两个字可以看成是形容词,后两个词可以看成是名词: 名称 举例 是什么 特点 指针数组 int *p[10] 数组 由指针构成,例子中指针指向整型 数组指针 int(*p)[ ...

  7. 2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)

    2020-09-25C++学习笔记引用2:二级指针形参与指针引用搭配做形参的使用方法区别重难点,注意事项主看综合代码(1.指针形参2.引用形参3.二级指针形参4.指针引用形参) 1.指针引用 #inc ...

  8. C++学习笔记7[指针]

    C++学习目录链接: C++学习笔记目录链接(持续更新中) 文章目录 一.变量和指针 1.指针的声明 2.指针的赋值 3.关于指针使用的说明 4.指针运算符和取地址运算符 5.指针运算 二.指针和数组 ...

  9. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

最新文章

  1. iOS实现tableViewCell或collectionCell中点击界面按钮跳转
  2. php 管理 mysql 数据库 代码_安装并使用phpMyAdmin管理MySQL数据库_php
  3. Struts文件上传包含修改文件上传参数,多文件上传
  4. px4原生源码学习四--Nuttx 实时操作系统编程
  5. 网络编程套接字(四)
  6. 用ADO.NET的ExecuteScalar方法返回单一值-资讯动态
  7. spring缓存_有关Spring缓存性能的更多信息
  8. 《Python入门到精通》运算符
  9. springMVC浏览器接受json报406错误的解决方法
  10. java 迭代器_Java中 ( Iterator ) 迭代器 详解 ( JDK8源码 )
  11. C/C++回调方式系列之二class接口回调和lambda程式
  12. 2016年5月27日更新后MSYS2的shell用法
  13. Vivado综合running时间太长
  14. 少儿计算机基础知识,学会这三个小知识,轻松入门少儿编程
  15. Solidity错误Stack Too Deep
  16. Python Tkinter 模块简要介绍
  17. Unity3D教程:简单的碰撞检测
  18. Android 中Native方法是怎样调用的
  19. getservbyname 及 struct servent
  20. python画画用哪库好_Python我要学画画-turtle库

热门文章

  1. scrapy.Request使用meta传递数据,以及deepcopy的使用
  2. python problem
  3. 第二章 Flask——Flask中的request
  4. python中的分支语句
  5. jasperReport Studio java报表设计(详细)
  6. jquery attr 设定src中含有(宏)符号的问题解决
  7. Zend Framework实例教程
  8. 关于visio你必须要知道的一些小技巧
  9. 通向财务自由之路03_判断之偏好:掌握市场为何对多数人来说如此之难
  10. 设计模式09_代理模式