C语言基础知识之(十三):指针、指针和数组

来源:互联网 发布:彩票合买代购源码 编辑:程序博客网 时间:2024/05/17 08:18

一、指针的声明和定义

1、访问数据一般有两种方式:直接、间接

直接:通过变量访问数据,

如:通过变量a访问内存单元。

int a = 10;

printf("%d\n",a);

间接:通过内存单元的地址访问数据。取地址符&,获取变量a所在的地址并用%p打印。

printf("变量a存储单元的地址:%p\n",&a);  

2、指针的定义

存储内存单元地址的变量称为:指针

指针变量是用来存储地址的。

语法:

类型修饰符 * 变量名 = 初始值(地址);

例:定义指针变量保存变量a内存单元的地址,并打印保存的地址。

int * p = &a;

printf("变量a存储单元的地址:%p\n", p);

   

3、定义指针变量

NULL表示空指针,表示0,专门给指针变量赋值用的。

int * p = NULL; //类似于inta = 0;

float * q = NULL;

char * r = NULL;

说明:

* 表示:定义的变量是指针变量,用来存储地址。

类型修饰符表示指针变量中的地址 操作的内存单元中存储的数据类型

指针变量的类型:类型修饰符*,指向某种数据类型的指针类型

p的类型: int *,指向整型数据的指针类型

q的类型: float *,指向浮点型数据的指针类型

   

指针变量通常被称为指针

p 整型指针     指向整型数据的指针

q 浮点型指针   指向浮点型数据的指针

r 字符型指针   指向字符型数据的指针

   

通过指针实现间接访问:先获取存储单元的地址

再使用 * 取值运算符,读取地址内的变量

int a = 100;

int *p = &a; // 获取变量a存储单元的地址

使用间接方式,访问变量a对应的内存单元

printf(“%d\n”, p);//使用*p读取指针p存储的地址中的变量值100.

 

间接赋值:

*p = 200; //找到p存储的地址后,往内存单元赋值

printf("通过变量a读取数据:%d 通过指针p读取数据:%d\n", a, *p);

printf("变量a内存单元的地址:%p 指针p中存储的地址:%p\n", &a,p);

 

指针的存储空间与操作系统有关,一个字节8位,故32位的系统指针的存储空间是4个字节,64位的系统指针的存储空间是8个字节。

  

总结:  

& 和 * 是配套使用的运算符,互为逆元算

& 获取变量存储单元的地址。

* 获取指针中的地址后访问变量的存储单元。

定义指针时,使用*是用来表示:p是指针变量。如int*p = NULL;说明p是指向int类型的指针,用来存储对应的int类型变量的地址。

如果*前面没有数据类型修饰,则*是取值运算符,用来读取指针存储地址中的存储单元的值。

 

二、指针运算

指针的运算只有加、减运算,如:p+1,p-1等,实际上是指针地址的偏移计算,这时指针的指向没有变化。

同时,定义指针时的指针类型,决定了指针移动的字节数。

 

第一种:p+n,

表示:从p指向的存储单元,向高位偏移N次,每次偏移的字节数等于指针指向的数据类型的字节数。p的指向没有改变,只是p里面存储的地址进行了曾加4个字节的计算。

如:inta = 100;int *p = &a;

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

printf("%p\n",p+1);

printf("%p\n",p+2);

打印的结果显示:p、p+1、p+2他们的地址依次相差4个字节,即int类型占用的4个字节数。

 

第二种:p-n,向低位移动,同样的p的指向没有改变,只是p里面存储的地址进行了减少4个字节的计算。

 

第三种:p++,++p,本质是:p = p + 1;所以经过运算后,指针的指向改变了。

第四种:p--,--p,本质是:p = p - 1;同样的,指针经过运算后的指向改变了。

三、指针和数组

数组的基本定义和运算:

1、定义数组

inta[5] = {1, 2, 3, 4, 5};

2、访问数组元素

a[0] = 10;

printf("%d\n",a[0]);

3、计算数组元素的个数

printf("%lu\n",  sizeof(a));//数组a的存储空间

printf("%lu\n",sizeof(int));

printf("%lu\n",sizeof(a[0]));//数组a中单个元素的存储空间

printf("元素个数:%lu\n",sizeof(a)/sizeof(a[0]));

   

4、重点  数组名:表示数组首元素的地址 a = &a[0];

   

   

数组和指针

可以使用指针访问数组元素:定义指针,指向数组首元素

访问数组元素的两种方式:下标法、指针法

1、下标法

//使用数组名访问

int a[5] = {11, 12,13, 14, 15};

for (int i = 0; i< 5; i++) {

    printf("%d ", a[i]);

}

//使用指针访问

int *p = a; //定义指针,指向首元素

for (int i = 0; i< 5; i++) {

    printf("%d ", p[i]);

}

   

2、指针法:通过指针偏移计算访问数组元素

*(数组名/指针+下标)

//使用数组名

int a[5] = {1, 2, 3,4, 5};

for (int i = 0; i< 5; i++) {

    printf("%d ", *(a+i));// a[i] 本质 *(a+i)

}

//使用指针

int *p = a;

for (int i = 0; i< 5; i++) {

    printf("%d ", *(p+i));

}   

  

指针和数组的区别

1、指针是变量,可以修改指向;数组名是常量,不可以修改,永远指向第一个元素

2、指针的存储空间:4/8个字节;数组的存储空间:元素个数*单个元素的存储空间

3、sizeof(数组名)得到数组的存储空间;

sizeof(指向数组的指针),不管指针指向谁,只跟操作系统有关,得到指针的存储空间4/8个字节;

 

指针的类型必须和指向的数据类型匹配。

指针的类型决定了指针访问存储单元的数量。

int * p 一次访问4个存储单元(字节)

char * p 一次访问1个存储单元(字节)


0 0