总结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的一个函数。
> 二级指针
> 一维数组
> 二维数组
> 指针和数组的关系
> 指针数组
> 数组指针
> 函数指针
一:一级指针:
指针是什么: 在计算机科学中,指针(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的一个函数。
相关文章推荐
- [黑马程序员]07[C语言]指针部分笔记总结-02
- C语言指针基础知识总结
- C语言指针和数组知识总结(下)
- C语言指针和数组知识总结(上)
- C语言中_指针_的相关知识总结
- C语言中 指针的基础知识总结, 指针数组的理解
- C语言指针部分教学总结
- C语言指针和数组知识总结(下)
- [黑马程序员]06[C语言]指针部分笔记总结-01
- C语言指针和数组知识总结(上)
- c语言第二周总结-高级指针
- 个人总结-布局的使用(附加部分其他知识总结)
- C语言指针总结
- C语言的指针、数据、结构体关系总结
- 【黑马程序员】--c语言中的指针总结
- 个人学习总结的部分java小知识与面试题(三)
- c语言 字符串和指针部分
- c语言中的部分知识
- C语言 printf 格式输出指针总结
- 计算机四级部分知识总结——路由器配置(二)