有关指针的经典语录 1)指针也是一种数据类型,指针的数据类型是指它所指向内存空间的数据类型 2)间接赋值*p是指针存在的最大意义 3)理解指针必须和内存四区概念相结合 4)应用指针必须和函数调用相结合(指针做函数参数) 接口的封装和设计、模块的划分、解决实际应用问题。 5)指针指向谁就把谁的地址赋给指针 6)C/C++语言有它自己的学习特点;若java语言的学习特点是学习、应用、上项目;那么C/C++语言的学习特点是:学习、理解、应用、上项目。多了一个步骤。 7) 理解指针关键在内存,没有内存哪来的内存首地址,没有内存首地址,哪来的指针。
解释:
int P; //这是一个普通的整型变量
int P; //首先从 P 处开始,先与结合,所以说明 P 是一个指针,然后再与 int 结合,说明指针所指向的内容的类型为 int 型.所以 P 是一个返回整型数据的指针
int P[3]; //首先从 P 处开始,先与[]结合,说明 P 是一个数组,然后与 int 结合,说明数组里的元素是整型的,所以 P 是一个由整型数据组成的数组
int P[3]; //首先从 P 处开始,先与[]结合,因为其优先级比高,所以 P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组
int (P)[3];//首先从 P 处开始,先与结合,说明 P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与 int 结合,说明数组里的元素是整型的.所以 P 是一个指向由整型数据组成的数组的指针
int **P; //首先从 P 开始,先与结合,说是 P 是一个指针,然后再与结合,说明指针所指向的元素是指针,然后再与 int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
int P(int); //从 P 处起,先与()结合,说明 P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的 int 结合,说明函数的返回值是一个整型数据
int (*P)(int); //从 P 处开始,先与指针结合,说明 P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个 int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以 P 是一个指向有一个整型参数且返回类型为整型的函数的指针
int (P(int))[3]; //可以先跳过,不看这个类型,过于复杂从 P 开始,先与()结合,说明 P 是一个函数,然后进入()里面,与 int 结合,说明函数有一个整型变量参数,然后再与外面的结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与结合,说明数组里的元素是指针,然后再与 int 结合,说明指针指向的内容是整型数据.所以 P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数. 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的 类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
一个指针在64位的计算机上,占8个字节; 一个指针在32位的计算机上,占4个字节。 原因如下: 我们都知道cpu是无法直接在硬盘上读取数据的,而是通过内存读取。cpu通过地址总线、数据总线、控制总线三条线对内存中的数据进行传输和操作。
具体流程: 1、cpu通过地址总线,找到该条数据; 2、通过控制总线得知该操作是读操作还是写操作; 3、通过数据总线将该数据读取到cpu或者从cpu写到内存中。 所以, 地址总线的宽度决定了CPU的寻址能力; 数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度; 控制总线决定了CPU对其他控件的控制能力以及控制方式
这里&是取地址运算符,是间接运算符。 &a 的运算结果是一个指针,指针的类型是 a 的类型加个,指针所指向的类型是 a 的类型,指针所指向的地址嘛,那就是 a 的地址。 p 的运算结果就五花八门了。总之p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p 指向的类型,它所占用的地址是 p所指向的地址。 例: int a=12; int b; int *p; int **ptr;
p=&a; //&a 的结果是一个指针,类型是 int*,指向的类型是int,指向的地址是 a 的地址。 *p=24; //*p 的结果,在这里它的类型是 int,它所占用的地址是p 所指向的地址,显然,p 就是变量 a。 ptr=&p; //&p 的结果是个指针,该指针的类型是 p 的类型加个,在这里是 int *。该指针所指向的类型是 p 的类型,这里是 int。该指针所指向的地址就是指针 p 自己的地址。 *ptr=&b; //ptr 是个指针,&b 的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b 来给ptr 赋值就是毫无问题的了。 **ptr=34; //ptr 的结果是 ptr 所指向的东西,在这里是一个指针,对这个指针再做一次运算, 结果是一个int类型的变量。
#include<stdio.h> void main() { char a = 0; char *p=a; printf("%d\n",sizeof(p));//打印指针所占内存数量 printf("%d\n", sizeof(*p));//打印指针所指向数据类型的内存数量 printf("%d\n", a);//打印赋给a的值 printf("%d\n", &a);//打印a的首地址(地址都不固定) printf("%d\n", &a+1);//打印a的首地址加一个该数据类型所占内存数量 printf("%d\n", &p);//打印指针首地址 printf("%d\n", &p+1);//打印指针首地址加一个该系统指针所占内存数量 }关于指针部分在C++中再详细介绍
希望关注点赞评论,传递知识 想要关注我一起学习的请关注公众号:莫林的日常 想要和志同道合的伙伴一起学习的请加QQ群:515271405