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

【黑马程序员】C语言指针总结

2015-10-19 20:22 337 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

最近刚学习完C语言,感觉指针部分知识点太碎,太容易混淆,所以总结一下供大家学习参考,有不对的地方也请大家多多指教。

为了比较清楚的区分各个知识点,我把不同部分都单独写了一个主题:

1.数组指针以及指针数组

http://blog.csdn.net/u011199045/article/details/49230517

2.字符串指针介绍及使用

http://blog.csdn.net/u011199045/article/details/49230491

3.指针函数以及函数指针

http://blog.csdn.net/u011199045/article/details/49230439

***********************************************************************************************

指针总结

1.指针的基本概念

内存单元的编号也叫地址。既然根据内存单元的编号或者地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。

2.使用指针的好处

a.为函数提供修改调用变量的灵活手段

b.让函数有多个返回值

c.可以改善某些子程序的效率>>在数据传递时,如果数据块较大(比如说数据缓冲区或较大的结构)这是就可以使用指针传递地址而不是实际数据,既提高传输速度,有节省大量内存。

d.为动态数据结构(如二叉树,链表)提供支持

3.变量的存取方式

存取方式分为两种:直接存取和间接存取。

直接存取:变量的赋值和取值

间接存取:通过指针(地址)间接操作完成。

4.什么是指针变量

在c语言中,允许用一个变量来存放指针,这种变量成为指针变量。因此,一个指针变量的值就是某个内存单元的地址或者某内存单元的指针。

注意:

  严格意义上说:指针是一个地址是一个常量

      指针变量是存放一个地址,是一个变量

5.指针变量如果不出事化会有什么后果?

如果一个指针变量定义以后如果不进行初始化,这个指针变量存放的是一个垃圾数,这个指针变量称为野指针。一定要避免操作野指针,因为可能会带来意想不到的错误。

1)可能会导致程序崩溃

2)访问你不该访问的数据

6.指针变量的初始化

1)完全初始化

int *p = &a;  //用a的地址初始化p这个指针变量(p指向了a)

2)部分初始化

int *p = &b,*p4  //定义了两个指针变量p3,p4

         3)如果定义了一个指针变量,但是不知道指向谁

int *p = NULL

int *p6 = 0;

把一个指针赋值为空,表示什么也不指。

应用:**********************用函数实现两变量值交换*************************

//
//  main.c
//  用函数实现两变量值交换
//
//  Created by Brisinga on 15/10/16.
//  Copyright © 2015年 yan. All rights reserved.
//

#include <stdio.h>

//定义变量值交换函数
void swap(int *p1,int *p2){

int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main(int argc, const char * argv[]) {

int a = 10;
int b = 5;
printf("a = %d,b = %d\n",a,b);
swap(&a, &b);
printf("a = %d,b = %d\n",a,b);
return 0;
}


7.在函数内部通过指针变量修改指针变量指向的内容

1)void changeValue(int *p){

*p = 100;

}

2)用指针让函数可以有多个返回值

//  指针的常见应用场景
//
//  Created by Brisinga on 15/10/16.
//  Copyright © 2015年 yan. All rights reserved.
//

#include <stdio.h>

void caculate(int x,int y,int *add,int *sub,int *mul,float *div){

//加法
*add = x+y;
//减法
*sub = x-y;
//乘法
*mul = x*y;
//除法
*div = x/(float)y;

}
int main(int argc, const char * argv[]) {

int add = 0;
int sub = 0;
int mul = 0;
float div = 0.0f;
int a = 10;
int b = 5;
caculate(a, b, &add, &sub, &mul, &div);
printf("a+b = %d\n",add);
printf("a-b = %d\n",sub);
printf("a*b = %d\n",mul);
printf("a/b = %.2f\n",div);
return 0;
}
//  指针的常见应用场景
//
//  Created by Brisinga on 15/10/16.
//  Copyright © 2015年 yan. All rights reserved.
//

#include <stdio.h>

void caculate(int x,int y,int *add,int *sub,int *mul,float *div){

//加法
*add = x+y;
//减法
*sub = x-y;
//乘法
*mul = x*y;
//除法
*div = x/(float)y;

}
int main(int argc, const char * argv[]) {

int add = 0;
int sub = 0;
int mul = 0;
float div = 0.0f;
int a = 10;
int b = 5;
caculate(a, b, &add, &sub, &mul, &div);
printf("a+b = %d\n",add);
printf("a-b = %d\n",sub);
printf("a*b = %d\n",mul);
printf("a/b = %.2f\n",div);
return 0;
}


7.二级指针介绍

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也成为“二级指针”

int a = 10;

int *p = &a;

int **p2 = &p;

8.指针为什么要区分类型

如果定义指针变量不定义类型,那么他在取*也就是取其种值的时候,就不知道该读取几个字节。而定义了之后,如果是int型就读四个字节,char就读一个字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针