您的位置:首页 > 编程语言 > C语言/C++

总结C语言指针部分的知识

2017-08-05 19:55 435 查看
> 一级指针 

> 二级指针 

> 一维数组 

> 二维数组 

> 指针和数组的关系 

> 指针数组 

> 数组指针 

> 函数指针 

一:一级指针:

指针是什么: 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 ——百度百科

可以说:指针就是变量,存放地址的变量。



此图对应的代码是:

#include <stdio.h>

int main()

{

int a = 10;

int* p = &a;

return 0;

}

指针存在原因是什么?

一个小的单元是一个字节

对于32位机器,假设有32根地址线,那么地址是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

……

11111111 11111111 11111111 11111111

那么就有2^32个地址

在32位机器上,一个地址大小是4个字节,64位机器上,一个地址大小是8个字节。

注:

1.指针是为了存放地址,地址是为了标示一块地址空间。

2.指针让地址有地方存放,指针让内存的访问变得便捷。

3.指针的大小在32位平台是4字节,在64位是8个字节。

指针类型
char* p = NULL;

int* p = NULL;

short* p = NULL;

long* p = NULL;

float* p = NULL;

double* p = NULL;

指针是有类型的:type+*的方式。

不同的类型指针是为了存放不同类型变量的地址。

这样做是为了:确定了指针运算的规律,定出了一定的规则。

指针类型是通过:

1.指针+-整数;

2.指针的解引用

来确定指针的运算规律。接下来我一一举例:

指针+-整数:

#include <stdio.h>

int main()

{
int num = 10;
char* pc = (char*)#
int *pi = #

printf("%p\n",&num);
printf("%p\n",pc);
printf("%p\n",pc+1);
printf("%p\n",pi);
printf("%p\n",pi+1);
return 0;
}

它的运行结果是:


可见:指针的类型决定了指针向前或向后走一步的距离。

指针的解引用:

指针的类型决定,对指针解引用能操作几个字节。

二.二级指针:

首先任何值都有地址 ,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址 ,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址。
——《搜狗百科》

int a = 10;

int * pa = &a;

int** ppa = &pa; 

请看此图:



关于二级指针的运算:

1.*ppa:通过对ppa中地址进行解引用,找到了pa:

.   int x = 0;

   *ppa = &b;

2.**ppa通过*ppa找到pa,再*pa找到a:

   *ppa = 30;

关于一维数组和二维数组,前面在《浅谈数组》一文中已经提到。

接下来介绍指针数组,数组指针与函数指针:

一:指针数组:

首先我要明确一个概念:指针数组是数组!

指针数组是数组,是一个存放指针的数组。

以下:

int* arr1[10]

char* arr2[5];

char **arr3[6];都是指针数组



另外:char* arr[3] = {"zhangsan","lisi","wangwu"};也是正确的:



注:计算时:

sizeof(arr);   大小是12,共有三个地址

strlen(arr);    大小是随机值

二.数组指针:
同样的道理,数组指针是指针!

是指向数组的指针。

int (*p)[10];

//解释:p和*先结合,表示p是一个指针,是指向一个大小为10个整形的数组。

类型是:int (*) [10]

数组指针如何使用?



这里我们可以看出,数组的地址和数组首元素地址的值相同,但是意义不同。

而数组的地址,是通过:int (*p)[10] = &arr;来存储。

因为p是一个数组指针,存放数组的地址最合适。

那么,二维数组传参是怎么做的?



了解了这些之后:

int arr[3];

int *p1[5]; //指针数组

int (*p2)[5];  //数组指针

int (*p3[5]) [3];  //存放数组指针的数组



三:函数指针



这两个地址是test函数的地址,那么地址如何保存呢?

void test()

{

printf("hello\n");

}

void (*pfun)();

pfun先和*结合,是指针,指针指向函数,指向的函数无参数,无返回值。

接下来介绍函数指针数组:把函数的地址存到一个数组中,那这个数组就叫函数指针数组:

int (*parr[10])();

parr先和[]结合,说明parr是数组,数组的内容是int(*)()类型的函数指针

指向函数指针数组的指针:

int (*(*parr)[10])();

parr是一个指针,该指针能指向一个数组,该数组是一个函数指针数组,数组的每个元素是一个函数指针,

该函数指针能够指向一个参数是int,char,返回类型是void的一个函数。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针 数组