首页 > 其他 > 详细

指针-2

时间:2019-06-16 12:13:06      阅读:94      评论:0      收藏:0      [点我收藏+]

1. 指针的重要性:

  •   表示一些复杂的数据结构(学数据结构必须学指针)
  •   快速的传递数据
  •   使函数返回一个以上的值
  •   能后方便的处理字符串
  •   是理解面向对象语言中的基础(java)

总结:指针是c语言的灵魂

2. 指针的定义

 (1)地址

    内存单元的编号

    从零开始的非负整数

    范围:4G(0-4G-1)

技术分享图片

控制线:控制数据传输的方向

数据线:进行数据传输

地址线:用来确定对内存条的哪个单元进行控制(有32个地址总线,一个地址线能控制2个内存单元,32个地址线能控制2^32个内存单元)

  (2)指针

  •       指针就是地址,地址就是指针
  •       指针变量就是存放单元编号的变量,或者说指针变量就是存放地址的变量
  •       指针和指针变量时两个不同的概念
  •            注意:通常我叙述时会把指针变量简称为指针,实际上他们是不同的概念
  •       指针的本质就是一个操作受限的非负整数(指针只能相减)      

        (3)指针的分类

      1. 基本类型指针   

    int * p;//p是变量的名字,(int *)表示p变量存放的是int类型变量的地址
            //int * p;不表示定义了一个名字叫做*p的变量
            //           所谓int * 类型实际就是存放int变量地址的类型
    int i = 3;
    p = &i; //  p保存了i的地址,因此p指向i
    *p= i ;  //*p就是i

 

指针常见错误

常见错误一:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    int * p; //p是局部变量,若不初始化,则为垃圾值
    int i = 5;
    *p = i;//错误,p应该先指向一个地址,p变量里面是一个垃圾值,不知道*p里面的内容,但是把i=5修改了一个不属于你的单元
    printf("%d\n", *p);

    return 0;
}

常见错误二:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 5;
    int * p;
    int * q;

    p = &i;
    //*q = p; //错误,int 不能向int * 转换
    //*q = *p; //error,因为q没有赋值,q是一个垃圾值,*q是一个不属于你能控制的单元
    p = q; //q是垃圾值,q赋给p,p也变成垃圾值
    printf("%d\n",*q);
           /*
                q的空间是属于本程序的,所以本程序可以读写q的内容
                但是如果q内部是垃圾值,则本程序不能读写*q的内容
                因为*q所代表的内存单元的控制权限并没有分配给本程序
                所以本程序运行到14行就会立即出错
                */
    return 0;
}

 

互换两个数字

#include <stdio.h>
#include <stdlib.h>

void exchange_1(int ,int );
void exchange_2(int * ,int *);
void exchange_3(int * ,int *);

int main()
{
  int a = 3;
  int b = 5;
  exchange_3(&a,&b); //exchange_2(*p,*q); 是错误的,exchange_2(a,b);是错误的
  printf("a = %d, b = %d\n",a,b);
}

 //不能完成互换功能
void exchange(int a, int b)
{
    int t;
    t = a;
    a = b;
    b = t;
    return ;
}

// 不能完成互换功能
 void exchange_2(int * p,int * q)// 形参名字是p,q接收实参数据的是p和q
 {
     int * t; //如果要互换p和q的值,则t必须是 int *类型,不能是int类型,否则会出错

     t = p;
     p = q;
     q = t;
 }
 
 //可以完成互换的功能
void exchange_3(int * p,int * q)
 {
     int t; //如果要互换*p和*q的值,则t必须定义成int,不能定义int *,否则会出错

     t = *p; //p是 int *, *p 是int(*p代表以p地址为整型的变量)
     *p = *q;
     *q = t;
 }

技术分享图片 

附注:

  *的含义

    1. 乘法

    2. 定义指针变量      

      int * p; //定义了一个名叫p的变量, int  *表示p只能存放int变量的地址

    3. 指针运算符

        该运算符放在已经定义好的指针变量的前面

        如果p是已经定义好的指针变量,则 *p表示  以p的内容为地址的变量

        例:int * p; //定义一个p的指针变量

          *p = 5; 

  如何通过被调函数修改主调函数普通变量的值

    1.  实参必须为该普通变量的地址

    2.  形参必须为指针变量

    3. 在被调函数中通过

         * 形参名 = .......

    的方式就可以修改主调函数相关变量的值

#include <stdio.h>
#include <stdlib.h>

void exchange_3(int * ,int * );

void exchange_3(int * p,int * q)
{
    int t; 
    t = *p;
    *p = *q;
    *q = t;
    return ;
}

int main()
{
    int a = 3;
    int b = 5;
    exchange_3(&a,&b);
    printf("a = %d, b = %d",a,b);
    return 0;
}

 

指针-2

原文:https://www.cnblogs.com/spore/p/11030164.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!