c语言学习18指针简介

时间:2024-11-17 18:55:34

1指针理解

指针是什么,能干什么

指针去操作变量

指针操作数组及数组元素shu

指针操作结构体

全名:指针类型

理解变量的值:根据需要的数据类型定义的变量,分配的内测分配的空间所写入的值

理解变量的地址编号值:

定义变量时,空间会分配相应的编号的地址空间,此变量的地址编号值为分配的空间的首字节地址编号的值

理解指针:指针类型是一种数据类型,用指针类型定义的变量叫指针类型变量(指针变量)(指针)

指针类型变量是用来存地址编号值的

2分析指针要素

2.1给出一个指针变量能分析出他的要素

        int *p;这是一个指针类型的变量(本质是一个变量)(是一个可以存地址编号的变量)

        分析:变量名:p     变量名的类型:int *     int 指向对象类型

说明:这是一个指针类型,可以用来存储地址编号的,可以存整型变量的地址编号

//指针类型:  除了变量名以外的内容就是变量名的类型

int (*p)[10]    变量名 :p        变量名类型 int (*)[10]            指向对象的类型int  [10] 

 int(*a) (void)     变量名:a        变量名类型  int(*) (void)              指向对象的类型 int (void)     

 int **p     变量名:p       变量名类型  int  **            指向对象的类型 int   *  

//指向对象的类型 : 除了*和变量名意外的内容 就是指向对象的类型

        举例  int a[];  变量名:a  变量名的类型:int  []

2.2 根据指针需求定义指针变量

格式:指向对象类型 *变量名; 

       说明:定义指针类型变量,根据需求选择确的指针类型,然后根据格式定义

举例:  

        int a;  int *p;        p=&a;//p存a的地址

        int *m; int **p;      p=&m;//px存m的地址

说明:指针变量p存储了变量a的地址;  ==可以说指针变量p指向了变量a;

          指针变量存了谁的地址,就是指向了谁

3指针的使用

  3.1      先定义一个符合要求的指针

明确指向(存了一个变量的地址)%x

3.2 &:取地址符                *:取空间内容符

        int *p;

        printf(“p:%d\n”,p);   //p里存储的值,

        printf(“*p:%d\n”,*p);//p里存储的值所代表的地址空间的编号

        printf(“&p:%d\n”,&p);//p的地址

注意:    int *p  定义语句中,*可以理解指针的标志

                printf(“p:%d\n”,*p);中的* 是取内容符号

int *p;

int a=10;

p=&a;

*p=20;    //*p取出a的值,将其改为20

        printf(“*p:%d\n”,*p);    //20

        printf(“*a:%d\n”,a);      //20

3.3指针变量占用空间的大小

关键字:

        功能:计算对应类型的变量占用空间的大小(字节)

        sizeof(变量名/变量名的类型)

看平台依据是32位,还是64位的,dev默认64

常用的为32位的,此时指针变量占4字节

64位的,指针变量占用8字节

指针变量占用空间大小,与所指的类型没有关系

指针变量的本质是:存储地址编号

所有的地址编号都是二进制32位的数据,32位就是4个字节。

3.4指针移位

说明:指针移位就是指针变量的增减

指针变量的移位后的结果,跟指向对象的类型有关

int a=10;

int *p;

char *q;

p=&a;

q=p;  //p存的地址给q,同时指向同一块空间,可以这样写不要这样用

#include  <stdio.h>

{

        int a=10;

        int *p;

        char *q;

        p=&a;

q=p;

//假设地址是0x1234578

 printf(“*p:%x\n”,*p);//12345678

 printf(“*q:%x\n”,*q);//78

// char 一个字节,只能是首字节,int 可以是四个字节

p=p+1;

q=q+1;

printf(“*p:%d\n”,*p);    //+4

 printf(“*a:%d\n”,*q);      //+1

 printf(“*p:%x\n”,*p);//垃圾值

 printf(“*q:%x\n”,*q);//56

//int *型移动一步,p指向偏移+4;char型移动一步,q偏移+1

}

指针移位跟指向对象的数据类型有关

int *                     +4

char *                +1

short*                +2

double *                +8

补充:

p+1;   //p存储的地址不变2017   (p+1)整体2021

p++;//p存储的地址变成2021