指针知识梳理8- 指针的指针

指针的指针:

我们假定环境都是32位系统。

1、回顾指针变量基本概念

http://blog.csdn.net/xiaoliu0518/article/details/32707111

指针变量:是变量,本质是内存,这块内存用来存储地址。

2、指针的指针

指针变量的地址:是变量,本质是内存,内存就有地址,存储这个内存的地址依然要用指针变量。

指针的指针:依然是指针变量,用来存储地址。

指针变量定义基本模型:

type *p;

type a;

p 是一个指针变量,*前面的type 决定了通过p存储的地址如何访问内存,p可以存储a这种变量的内存。

(1)如果type 为int,那么:

int *p;

int a;

p 存储a的地址,*p的时候,从所存储的地址开始访问4个字节,按照int的数据组织方式。

(2)如果type 为char,那么:

char *p;

char a;

p 存储a的地址,*p的时候,从所存储的地址开始访问1个字节,按照char的数据组织方式。

(3)如果type 为char*,那么:

char **P; //为了更好理解 ,可以加个括号 (char*) *p;

char *a; // (int*) a;

p 存储a的地址,*p的时候,从p存储的地址开始访问4个字节,这四个字节存储的是地址。

(4)如果type 为char**,那么:

char** *p;

char** a;

p 存储a的地址,*p的时候,从p存储的地址开始访问4个字节,这四个字节存储的是地址。

3、指针变量所占内存大小

注意当定义变量的时候一旦有一个 *,那么这个变量就是个指针变量,可以用type *p,这个模型去分析。

在32位系统中,所有的指针变量,都是用来存储地址,在32位系统中,地址位为32个2进制位,存储地址用4个字节。

大家可以验证

sizeof(char*);

sizeof(int*);

sizeof(char**);

sizeof(char********);

4、综合验证

验证如下代码,并画内存图:

#include <stdio.h>
int main()
{
	char c = '1';
	char *p;
	char **pp;
	char ***ppp;

	p = &c;  //p 存储c的地址,通过p能找到c
	pp = &p; //pp存储p的地址,通过pp能找到p,通过p能找到c
	ppp = &pp; //ppp存储pp的地址,通过ppp找到pp,通过pp找到p,通过p找到c

	printf("%p\n",ppp);
	printf("%p\n",&pp);

	printf("%p\n",pp);
	printf("%p\n",&p);

	printf("%p\n",p);
	printf("%p\n",&c);

	/*
		*p = c;

		*pp = p;
		*ppp = pp
		**pp = *(*pp) = *p = c;

		**ppp  = *(*ppp) = *(pp) = p;
		***ppp = *(**pp) = *p = c;
	*/

	/*
	注意1: **pp 执行是一层一层往下找的,先*pp找到p,然后*p 找到c;
	能够执行的前提是 变量pp存储了变量p的地址,变量p存储了a的地址,否则就会段错误。

	注意2:pp = &&a;这种写法是错误的:
	初学常范的错误是理解是p = &a,那么&a得到的是p:
	这是错误的,&a得到是数据,数据存储在变量p中,也可以存储在p1中。
	只能对内存取地址,反应在代码上是对变量取地址,而不能对数据取地址。
	&a 是数据,不能对数据取地址。

	*/

	return 0;
}

指针知识梳理8- 指针的指针

时间: 2024-11-05 20:45:40

指针知识梳理8- 指针的指针的相关文章

指针知识梳理7- 函数指针

一.函数的地址 前面讲 程序运行起来以后,在内存中有代码区,程序运行每一条指令,是从内存中读出来这条指令,然后再运行. 所谓函数的地址是指函数的入口地址,这个函数的从这个地址開始进入运行,也就是从这个地址处取指令运行. 那么在代码层面,函数的地址用 函数指针变量 来存储. 二.基本使用 1.函数指针定义 函数指针的定义,在语法看起来略微有点怪,仅仅须要记住形式 返回值 (*指针变量名)(形參类型): 比方,下面4个函数 void func1(void) { } int func2(void) {

指针知识梳理6-const与指针

const 定义的变量为只读变量,在语法层面上通过这个变量去修改内存是不允许的. 但是对于以下代码,就有很多人绕了: const int  *p1;  //p1能变,*p1不能变 int const  *p2;  //p2能变,*p2不能变 int *const  p3;  //p3不能变,*p2能变 我们通过代码来验证说明这三种写法: </pre><p></p><pre> #include <stdio.h> int main() { int

指针知识梳理2-指针与一维数组

一.一维数组复习 数组的本质是连续的内存,我们可以通过一下代码验证. int main() { int a[10]; int i; for(i = 0;i<10;i++) { printf("%p\n",&a[i]); } } 打印出每个元素的地址,会发现地址间隔是4 ,这个间隔刚好等于sizeof(int). 那么如果知道了a[0]的地址,我们就可以通过地址的加减算出a[i]的地址,然后访问a[i]; 二.通过指针访问一维数组 指针能够访问一维数组的两个前提是: 1.内

指针知识梳理3-指针作为参数

一.函数传参复习 #include <stdio.h> //指针传参,函数传参本质是值传递 void func1(int a) { a = 5; } void func2(int *p) { *p = 10; p++; } int main() { int a = 0; int *p = &a; //a 的值会变么? func1(a); printf("%d\n",a); func2(&a); printf("%d\n",a); //这里

指针知识梳理1-变量基本定义及使用

一.指针变量.地址.数据.内存关系 在学习指针之前,我们先统一几个概念. (1)在计算机中本质 用 内存 来存储 数据 ,在我们写代码的时候,用变量来存储数据 . (2)变量是在编程语言中的概念,方便我们编程,当编译运行起来以后,就只有内存了和数据了. 比如 当 我们写代码 int a; int b; a = 1; b = a; 第1行第2行,语法层面是 定义两个变量,计算机层面是在内存中申请 2个4字节内存,a地址 0x10,b地址  0x0c 第3行,语法层面是 给变量a赋值1,计算机层面是

指针知识梳理10-指向数组的指针

一.指向数组的指针 1.所谓指向的意思:我们通常说指针变量指向某个变量或者某块内存,意思是这个指针变量存储了某个变量的地址或者某块内存的地址. 2.一个变量可以占多个字节,我们通常所说某个 的地址指的是这块内存的起始地址.比如int  a,变量a栈 0x10 0x11 0x12 0x13这四个字节,那么a的地址是0x10. 3.(1)以前我们定义一个数组的时候,通常是把这个数组当做同种类型的变量的集合来看的,即数组的每个元素,用法为a[i]. (2)我们也可以把数组当做一个整体来看,int  a

指针知识梳理9-指针数组

1.基本概念 指针数组:本质是数组,数组的每个元素是指针,数组的每个元素可以存储地址. 2.基本定义 (1)先回顾,数组定义基本模型 type a[len]; 访问 数组的每个成员用 a[i]; 每个成员所占内存大小 sizeof(type); 数组总共占内存大小  sizeof(a) = sizeof(type)*len; (2)指针数组 如果学会了指针,学会了数组,到了这里就是一个综合应用的问题. 按照以上模型: ---------------------------------------

指针知识梳理5-字符串与指针,程序内存总结

一.文字常量区域 #include <stdio.h> int main() { char *p = "hello"; int i = 0; for(i = 0;i<6;i++) { printf("%c",*(p+i)); } *p = '1'; } 大家分析验证以上代码.p 是一个指针变量,存储地址,"hello"是一个字符串占6个字节,当我们用printf的时候可以输出"hello",我们得出结论,p存

指针知识总结

一.指针 定义:指针用来保存.操作内存,解决系统堆栈空间的溢出问题,可更为灵活的使用内存. #地址是变量在内存中的编号,可用取地址符"&"来获得变量的地址. #指针可以保存地址. #野指针:每个指针必须有对应的一个变量地址,若没有就是一个野指针,其带有损害. #空指针:解决办法是将指针初始化为零. #指针只能存储.操作.运算与它类型相同的变量的地址. #用指针访问变量值:*p = i: 指针通过间接运算符"*"+指针变量"p"来访问变量i