黑马程序员-[C语言]第三篇:指针总结
2015-08-20 19:53
393 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
一、指针概述
1. 指针概念:
内存单元的编号叫做地址,我们根据内存单元的编号或者地址可以找到所需要的存储单元,我们把这个地址叫做指针。
对于一个内存单元来说,该内存单元的地址就是指针,其中存放的数据才是该内存单元的内容。
2. 使用指针的优点:
1)为函数提供调用和修改变量的灵活手段
2)让函数有多个返回值(通过形参传递地址,可以修改主调函数中变量的值)
3)改善某些子程序的效率(数据块较大,不适合传递,可以将其地址传递)
4)为动态数据结构提供支持(二叉树、链表)
3. 变量的存取方式:
直接存取:变量的赋值和取值
间接存取:通过指针间操作完成
二、指针变量
1.概念:
在C语言中,允许一个变量来存放指针,这种变量称为指针变量。因此,指针变量的值就是某个内存单元的地址或称为某个内存单元的指针。
注意:指针是一个地址,是常量。指针变量是存放一个地址,是变量。
2. 定义一个指针:
类型说明符 *变量名;
*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
3. 指针初始化
1)定义时初始化: int a=3; int *p = &a;
2)定义后初始化: int a=3,*p; p = &a;
3)定义后不知道指向哪里: int *p=NULL;
4. 指针使用前,必须初始化!刚定义的指针,没有进行初始化时,是一个野指针,指向一个垃圾值。
5. 指针为什么区分类型:
在64位的编译器里,所有类型的指针都是固定8个字节(32位4个字节),但是不同类型的变量却占用不同的字节数。指针区分类型后,按访问指向的数值时可以根据指针类型长度进行取值。定义什么类型的的指针,就指向什么类型的变量。
三、数组指针
1. 一个变量有地址,一个数组包含若干个元素,每个数组元素都有相应的地址。指针变量可以指向数组元素,所谓数据元素的指针,就是数组元素的地址。可以用一个指针指向一个数组。
2. 假设一个数组的数组名为a,a不代表整个数组,只代表数组首元素的地址。
例如: int *p = a; 表示指针变量p指向了数组首个元素a[0]
四、指针函数
1. 概念:C语言中允许一个函数的返回值是一个地址(即指针),这种返回值是指针的函数称为指针函数。
2. 定义: 返回值类型 *函数名(形式参数列表){ //函数体 }
五、函数指针
1. 概念:C语言中,一个函数总是占用一个连续的内存区,而函数名就是该函数所占内存区的首地址。我们把这个首地址(入口地址)赋值给一个指针变量,使该指针变量指向该函数。然后通过这个指针变量就可以调用该函数。我们把这种指向函数的指针变量称为“函数指针变量”。
2.定义:类型说明符 (*指针变量名)(形式参数列表)
例如:某一函数声明:int max(int x,int y); 函数指针定义: int (*p1)(int x,int y);
六、示例程序
运行结果:
3.用指针逆序存放数组元素
运行结果:
4. 字符串排序
运行结果:
一、指针概述
1. 指针概念:
内存单元的编号叫做地址,我们根据内存单元的编号或者地址可以找到所需要的存储单元,我们把这个地址叫做指针。
对于一个内存单元来说,该内存单元的地址就是指针,其中存放的数据才是该内存单元的内容。
2. 使用指针的优点:
1)为函数提供调用和修改变量的灵活手段
2)让函数有多个返回值(通过形参传递地址,可以修改主调函数中变量的值)
3)改善某些子程序的效率(数据块较大,不适合传递,可以将其地址传递)
4)为动态数据结构提供支持(二叉树、链表)
3. 变量的存取方式:
直接存取:变量的赋值和取值
间接存取:通过指针间操作完成
二、指针变量
1.概念:
在C语言中,允许一个变量来存放指针,这种变量称为指针变量。因此,指针变量的值就是某个内存单元的地址或称为某个内存单元的指针。
注意:指针是一个地址,是常量。指针变量是存放一个地址,是变量。
2. 定义一个指针:
类型说明符 *变量名;
*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
3. 指针初始化
1)定义时初始化: int a=3; int *p = &a;
2)定义后初始化: int a=3,*p; p = &a;
3)定义后不知道指向哪里: int *p=NULL;
4. 指针使用前,必须初始化!刚定义的指针,没有进行初始化时,是一个野指针,指向一个垃圾值。
5. 指针为什么区分类型:
在64位的编译器里,所有类型的指针都是固定8个字节(32位4个字节),但是不同类型的变量却占用不同的字节数。指针区分类型后,按访问指向的数值时可以根据指针类型长度进行取值。定义什么类型的的指针,就指向什么类型的变量。
三、数组指针
1. 一个变量有地址,一个数组包含若干个元素,每个数组元素都有相应的地址。指针变量可以指向数组元素,所谓数据元素的指针,就是数组元素的地址。可以用一个指针指向一个数组。
2. 假设一个数组的数组名为a,a不代表整个数组,只代表数组首元素的地址。
例如: int *p = a; 表示指针变量p指向了数组首个元素a[0]
四、指针函数
1. 概念:C语言中允许一个函数的返回值是一个地址(即指针),这种返回值是指针的函数称为指针函数。
2. 定义: 返回值类型 *函数名(形式参数列表){ //函数体 }
五、函数指针
1. 概念:C语言中,一个函数总是占用一个连续的内存区,而函数名就是该函数所占内存区的首地址。我们把这个首地址(入口地址)赋值给一个指针变量,使该指针变量指向该函数。然后通过这个指针变量就可以调用该函数。我们把这种指向函数的指针变量称为“函数指针变量”。
2.定义:类型说明符 (*指针变量名)(形式参数列表)
例如:某一函数声明:int max(int x,int y); 函数指针定义: int (*p1)(int x,int y);
六、示例程序
1. 使用函数,将两个数值交换 #include <stdio.h> //正确函数 void swap(int *p1,int *p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } //错误函数,单纯地址交换,在形参中指针的内容交换 //执行完后释放掉,主调函数中的变量没有发生任何变化 void swap1(int *p1,int *p2){ int *temp; temp = p1; p1 = p2; p2 = temp; } void main(){ int a=2; int b=3; printf("交换前两数的值为:%d %d\n",a,b); swap(&a , &b); printf("交换后两数的值为:%d %d\n",a,b); }
运行结果:
3.用指针逆序存放数组元素
#include <stdio.h> void nixu(int arr[],int n){ int *p= arr,*q= arr+(n-1),temp; while( p < q ){ temp = *p; *p = *q; *q = temp; p++; q--; printf("p = %p\t",p-1); printf("q = %p\n",q+1); } printf("\n交换后数组内容与地址*****************\n"); } void main(){ int i,arry[11]={1,2,3,4,5,6,7,8,9,10,10}; int *p = arry; //指针变量初始化 printf("p = %p\n",p); //输出指针变量的内容 printf("&p = %p\n",&p); //输出指针变量的地址 printf("arry = %p\n",arry); //输出数组首地址 printf("&arry[0] = %p\n",&arry[0]);//输出数组首个元素的地址 printf("\n交换前数组内容与地址*****************\n"); for(i=0;i<10;i++){ printf("a[%d] = %d\t",i,*(p++)); //输出 *p所指向的内容,然后p=p+1 printf("p = %p\t",p-1); //输出 p中存储的内容 printf("&a[%d] = %p\n",i,&arry[i]); //每个数组元素的地址 } printf("\n函数形参地址变化*****************\n"); nixu(arry,10); p=arry; for(i=0;i<10;i++){ printf("a[%d] = %d\t",i,*(p++)); printf("p = %p\t",p-1); printf("&a[%d] = %p\n",i,&arry[i]); //每个数组元素的地址 } printf("\n"); }
运行结果:
4. 字符串排序
/* 排序的方法:冒泡排序,选择排序 字符串比较函数:调用<stdlib.h> strcmp(str1,str2) strcmp(str1,str2) < 0 ----> str1 > str2 = 0 ----> str1 = str2 > 0 ----> str1 < str2 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int i,j; char *temp; char *ch[]={"CHINA","AMERCIAN","AUSTIALIA","RUSSIA"}; printf("strlen(ch) = %ld\n",strlen(*ch)); printf("%s,%s,%s,%s\n",ch[0],ch[1],ch[2],ch[3]); for(i=0;i<2;i++){ for(j=0;j<3;j++){ if(strcmp(ch[j],ch[j+1]) > 0){ temp = ch[j]; ch[j] = ch[j+1]; ch[j+1] = temp; } } } printf("%s,%s,%s,%s\n",ch[0],ch[1],ch[2],ch[3]); return 0; }
运行结果:
相关文章推荐
- Binary Tree Paths
- c++中类型转换积累(持续更新)
- C++ Primer 5e chapter 6
- C++primer学习笔记(一):第二章.变量和基本类型
- c++中 string 转 __time64_t
- [iOS]C语言知识点系列视频
- 不要以多态的方式处理数组(More Effective-C++_3(基础))
- hdu1069//zoj1093 Monkey and Banana (排序,dp)
- Event C++初识
- C++ 头文件
- C++友元类【未完待续】
- 初步篇11算术运算符与算术表达式项目5-坐标转换
- c++模板函数声明定义分离编译错误详解
- C++开源库
- C++常见错误及解决方法,持续更新
- 初步篇11算术运算符与算术表达式项目4玩数字
- [黑马程序员]C语言指针深入理解
- 初步篇11算术运算符与算术表达式项目3小明买花问题
- Gcc与Make编译C/C++学习
- 初步篇11算术运算符与算术表达式项目2分离整数和小数部分