08. 地址和指针

地址和指针★★★★★★★

(Adress)  (Pointer)

 

内存(Memory):临时性存储正在运行的程序数据

硬盘(HardDisk):永久性的存储所有的数据

 

难点:准确判断出指针到底指向谁:判断一个指针指向谁,只需判断该指针中保存的是谁的地址

#include<stdio.h>

int main()
{
    int x = 3;
    int* p;
    p = &x;    //将x的地址取出,并赋给p

    printf("%d %d\n", p, &x);

    return 0;

}

注意:& 只能对变量取地址,不能对常量和表达式取地址

 

★★★

若在程序中定义了一个变量,C编程系统就会根据定义中的变量的类型,为其分配一定字节数目的空间(在VC6.0 中 short int 型数据占2字节,int 型数据和 float 型数据占4字节,double 型数据占8字节,char 型数据占1字节,指针变量占4字节)

 

C语言中的含义

1、乘号   1*2

2、定义指针变量:int*  p(当 * 作为第二种含义时,只能与前面的数据类型看成一个整体,不能与后面的指针变量看作一个整体)

3、间接访问(引用)运算符:*p = 4(当 * 作为第三种含义时,必须与后面的指针变量看作一个整体)

 

语法:后面只能出现指针,或地址,不能出现普通的常量或变量

功能:是在引用 后面的指针(地址),所指向的存储单元中的值

 

性质:当 指针指向某个变量 时,*p 与 完全等价:

1、*p 的值与类型跟 的值与类型完全相同

2、改变了 的值,*p 的值也会随之而改变,反之依然

 

注意:若对指针的概念不清,以致滥用,将大大降低程序的可读性,如果对指针使用不当,将指针指向意料不到的地方,致使程序失控,严重的将导致系统崩溃。

#include<stdio.h>

int main()
{
    int x = 3;
    int * p;

    p = &x;    //p指向了x    *p <=> x
    x++;    //x:4
    (*p)++;    //*p++ <=> *(p++)


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

    return 0;

}
#include<stdio.h>

void swap(int* a, int* b)    //参数传递:a = &x, b = &y  a指向了x, b指向了y  
{                             //*a <=> x, *b <=> y
    int t; 

    t = *a;    //<=> t = x
    *a = *b;    //<=> x = y
    *b = t;    //<=> y = t

}


int main()
{

    int x = 1, y = 2;

    swap(&x, &y);

    printf("%d %d\n", x, y);

    return 0;

}



 

利用指针进行参数传递实现函数中同时返回多个值的功能,即指针可传递多个值

#include<stdio.h>

void cirle(double  r, double * s, double * c)    //参数传递:r = 10, s = &mj, c=&zc  
{                                                //s指向了mj, c指向了zc    *s <=> mj, *c <=> zc                                                                                                          
    *s = 3.14*r*r;                                
    *c = 2*3.14*r;

}



int main()
{
    double mj, zc;

    cirle(10, &mj, &zc);

    printf("%g %g\n", mj, zc);

    return 0;

}

 

准确判断常量、变量、表达式类型 :

1、= 左边只能变量 ,不能出现常量和表达式

2、= 左右两边的类型必须匹配

 

这里:**q <=> *(*q) <=> *p <=> x

#include<stdio.h>

int main()
{
    int x = 3, *p = &x;
    int** q;    //定义int型指针的指针

    q = &p;    //q指向了p

    return 0;

}
#include<stdio.h>

int main()
{
    int x = 3, *p = &x;
    int** q;
    
    q = &p;

    printf("%d %d %d %d %d\n", q, &q,  p, *p, **q);    // 04  06  02  3  3

    return 0;

}                       

 

示例:下列给定程序中,函数 fun 的功能是:计算如下:

例如:若形参e的值为1e-3  则函数返回值为0.551690

#include<stdio.h>

int main()
{
    double s=0, fz=3, dishu=2, n=1;

    while(fz/(dishu*dishu)>1e-3)
    {
        s=s+fz/(dishu*dishu)*n;    //计算s
        fz=fz+2;    //计算下一项的分子
        dishu=dishu+2;    //计算下一项分母的底数
        n=-n;
    }

    printf("%f\n", s);

    return 0;

}

 

★★★★★★★

1、普通的变量(常量):4种类型之间均能互相匹配

    int、double、float、char    例如 int

2、普通的指针(地址):4种类型之间均不能能互相匹配

    int*、double*、float*、char *

3、指针的指针:4种类型之间均不能能互相匹配

    int**、double**、float**、char **

4、特殊的指针(地址)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值