5.疯狂指针-贰

转载请标明出处:http://blog.csdn.net/u012637501

多级指针

指针变量保存的是指向变量地址,有点需要区别:

1. 数据类型 * 变量名:* 表示该变量为指针变量,存放的是(数据类型)变量的存储地址,如int
*p=&i;

2. * 指针变量:*表示指向"以指针变量的内容为存储地址的变量",如*p=i;

§举例1:多级指针的关系

#include <stdio.h>

int main(void)

{

int i = 10; 
       // i

int  *p = &i; 
    // 最终 *p就是 i,p存放的是int类型变量的地址;

int* *q = &p;
      // q 只能存放 int * 类型的地址 即p 的地址&p

int** *r = &q;  
   // r 只能存放  int ** 类型的地址 即q 的地址&q

//r = &p;         //error! 因为r是int***类型,只能存放int **类型变量的地址

printf("i = %d\n", ***r); //*r = q; **r = *q =p  ***r = **q = *p = i;

printf("i = %d\n", **q); //*q = p ;  **q = *p  === i

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

printf("i = %d\n", i);

return 0;

}

◆运行结果:

◆内存分析

§举例2:多级指针在函数中的调用

#include <stdio.h>

//多级指针在函数中的应用

//▲重要:q=&p,其中q为int
**类型

void f(int ** q)

{

**q = 100;//*q就是p,q=&p->*q=*&p=p->*(*q)=*p=i

}

void g()

{

int i = 10;

int * p = &i;    //可得到*p=i

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

f(&p); //p是int *类型
&p就是int ** 类型

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

}

int main(void)

{

g();

return 0;

}

◆运行结果:

◆内存分析:

§举例3:多级指针在函数中的调用

#include <stdio.h>
#include <malloc.h>
void f(int * q) //q是p的拷贝副本 q=p
{
     *q = 1;
}
void g(int **r)
{
     **r = 2;
}
void h(int ***s)
{
     ***s = 3;
}
void i(int ****t)
{
     ****t = 4;
}
//要想修改函数变量的值,只能发送该变量的地址,修改一个以上的值,必须用指针
int main(void)
{
     int *p = (int *)malloc(4);	//开辟大小为4字节的内存空间,将内存首地址赋值给指针变量p
     printf("*p = %d\n", *p);	//垃圾值

     f(p); //调用的是指针(将指针变量保存的地址作为实参传递)
     printf("*p = %d\n", *p);	//*p=*q=1

     g(&p);//调用的是指针变量的地址(将指针变量的地址作为实参传递,&p相当于int **类型)
     printf("*p = %d\n", *p);	//2
     //h(&(&p));// error C2102: '&' requires l-value
     int **pp = &p; //pp是存放p地址的指针,int ** 整型指针的指针类型
     h(&pp); //调用的是存放p指针的指针的地址	int ***整型指针的指针的指针类型
     printf("*p = %d\n", *p);	//3

     int ***ppp = &pp;
     i(&ppp);//调用的是一个三级指针的指针的地址,int **** 整型四级指针
     printf("*p = %d\n", *p);	//4
    return 0;
}

◆运行结果:

◆说明分析:

(1)int *p=&i:指针变量p存放的是int类型变量(i)的地址,该指针变量p为int
*类型变量;

(2)int * *pp=&p:指针变量pp存放的是int *类型变量(p)的地址,该指针变量pp为int
**类型变量;

(3)int ** *ppp=&pp:指针变量ppp存放的是int **类型变量(pp)的地址,该指针变量ppp为int
***类型变量;

(4)void f(int  *q):需要传递int 类型变量的地址作为参数,如指针变量p
(其内容即为int类型变量的地址)

(5)void g(int * *r):需要传递int *类型变量的地址作为参数,如指针变量p的地址&p

(6)void h(int ** *s):需要传递int
**类型变量的地址作为参数,如指针变量pp的地址&pp

(7)void i(int *** *t) :需要传递int
***类型变量的地址作为参数,如指针变量ppp的地址&ppp.

注:*变量名,其中*有两个作用:(1)声明变量为指针变量,只能存放地址;

(2)指明该指针变量的数据类型为: 类型名
*

时间: 2024-11-23 01:34:48

5.疯狂指针-贰的相关文章

4.疯狂指针-壹

转载请标明出处:http://blog.csdn.net/u012637501 内存的存储是以一个字节为一个编号,也就是8位合在一起给一个编号,不是0,1就给编号. 内存分为很多个单元,每个单元就会分配一个编号. 指针核心: (1)数据类型 * 变量名:* 表示该变量为指针变量,存放的是(数据类型)变量的 存储地址,如int *p=&i; (2)* 指针变量:*表示指向"以指针变量的内容为存储地址的 变量",如*p=i; 一.指针概念 1.地址:地址就是内存单元的一个编号,从0

【C疯狂的教材】(九)C语言指针(一)

1.什么是地址? 内存是由若干个1个字节的内存单元组成的存储器 计算机为了管理内存单元.给每一个字节都进行编号 编号的就是地址 2.什么是指针? 地址就是指针 地址: 地址指向的内存单元值:编号相应的存储内容 变量訪问的方法:直接訪问    间接訪问 1)直接訪问:用变量名訪问其代表的存储空间 2)间接訪问:通过内存地址訪问地址所相应的存储单元的内容 3.指针和变量之间的关系 指针能够间接的訪问变量的值 1)指针变量:就是用来存放地址的变量 指针变量也遵守变量使用的规则 :先定义  --->初始

【C语言疯狂讲义】(九)C语言指针(一)

1.什么是地址? 内存是由若干个1个字节的内存单元组成的存储器 计算机为了管理内存单元,给每个字节都进行编号 编号的就是地址 2.什么是指针? 地址就是指针 地址: 地址指向的内存单元值:编号对应的存储内容 变量访问的方法:直接访问    间接访问 1)直接访问:用变量名访问其代表的存储空间 2)间接访问:通过内存地址访问地址所对应的存储单元的内容 3.指针和变量之间的关系 指针可以间接的访问变量的值 1)指针变量:就是用来存放地址的变量 指针变量也遵守变量使用的规则 :先定义  --->初始化

《疯狂java-突破程序员基本功的16课 》笔记总结

本人最近读完<疯狂java-突破程序员基本功的16课 >读完后,感觉对java基础又有了新的认识,在这里总结一下:一.数组与内存控制 1.1 数组初始化 java语言的数组是静态的,即数组初始化之后,长度不可以变(区别,JavaScript数组可变,是动态的). 初始化分两种:静态初始化,初始化时由程序员指定每个数组元素的初始值,系统决定长度. 动态初始化,初始化时由程序员指定数组的长度,由系统指定默认值(int为0.boolean为false). 初始化=长度+初始值:注意不能同时指定长度又

C语言指针—————第二篇:指向另一指针的指针

本文转自 : http://c.biancheng.net/cpp/html/495.html  原文存在部分问题,现在已经修改,并重新发出来 一.回顾指针概念 早在本书第贰篇中我就对指针的实质进行了阐述.今天我们又要学习一个叫做“指向另一指针地址”的指针.让我们先回顾一下指针的概念吧!当我们程序如下声明变量:   short int i;   char a;   short int * pi;程序会在内存某地址空间上为各变量开辟空间,如下图所示: 图中所示中可看出:   i 变量在内存地址5的

(15)疯狂的程序员----《绝影》

<疯狂的程序员> <疯狂的程序员>1 天已经七分黑了,屋里却还没开灯.这个全身黑衣服的男子突然像想起什么,从包里掏出烟,抽出一只,递给旁边的人:"兄弟,抽烟么?"――那烟是红塔山. 旁边那人连忙一边摆手,一边说:"不,不."语气有点紧张,好像那黑衣服递过来的不是烟,是海洛因. 这个黑衣服的男子,后来的网名叫"绝影".他旁边那个,后来被他们称为"土匪".这件屋子,就是他们大学寝室. 第一天到学校,其实没有

c指针点滴1

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 void main() 6 { 7 int num = 10; 8 int *p = &num;//&num是一个地址 一个常量 9 //p是一个指针变量 可以存储一个地址 一个变量 10 } 11 void main3() 12 { 13 int *p1; 14 char *p2; 15 double *p3; 16 printf("%d,%d,%d&quo

c语言指针点滴1

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main() 5 { 6 int *p = NULL;//指针开始最好都初始化为空 7 if(p == NULL) 8 { 9 printf("妹子p现在是单身 可以疯狂的进攻"); 10 }else 11 { 12 printf("妹子p不是单身 请慎重考虑"); 13 } 14 //printf("%d",*p);/

0715-----C++Primer听课笔记----------疯狂封装之生产者与消费者

1.程序框架分析: a)首先将mutex, condition, queue 封装成各自的类,方便对外提供接口函数,这里要注意 condition的封装,一个条件变量和一把锁是一起用的,因此在初始化 condition 对象的时候要用一个 mutex 对象去初始化,在pthread_cond_wait函数中还要用到互斥锁中的指针,因此在mutex 类中要封装一个返回相应类型的函数.此外多个条件变量一般是和同一互斥锁进行交互,因此要在condition 中的  mutex对象设为引用,这里可以这样