黑马程序员——指针的应用
黑马程序员——指针的应用
内存单元的标号也叫做地址,既然根据内存单元的编号或地址可以找到所需的内存单元,所以通常也把这个地址成为指针
允许用一个变量来存放指针,这种变量称为指针变量
指针是一个地址,是一个常量
指针变量存放一个地址,是一个变量
**1、定义指针变量**
一般形式为:类型说明符 *变量名;
*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型
例如:int *pi; //一个指向整形变量的指针 long *pi; //一个指向长整形变量的指针 float *pi;//一个指向浮点型变量的指针 char *pi;//一个指向字符型变量的指针
**2、指针变量的定义**
数据类型 *指针变量名
int *p; //定义了一个指针变量,变量名为p。。int表示,p只能存放一个int类型的变量的地址
char *p1; //定义了一个指针变量,变量名为p1。。p1只能存放一个char类型数据变量的地址
注意:1)*必须得有,如果没有就相当于定义一个普通变量。2)指针变量不能用来存放数值或者字符。3)指针变量有全局和局部之分
**3、指针变量的初始化和引用**
1)指针变量的初始化
1、定义的同时初始化:int *p=&a;
2、先定义后初始化:int *p;p=NULL;(最好别用这个)
3、如果定义了一个指针变量,但不知道让这个指针指向谁可以写成:int *p=NULL;//null是空的意思
**常见错误**
不能直接将一个整数赋值给指针变量
2)*指针变量 作用:获取指针变量指向的内存空间的内容
获取指针变量值所对应的存储单元
int value=*p;
**“*”的用法**
1)用于定义一个指针
2)存储指针变量指向的存储空间的内容
**4、二级指针**
概念:如果一个指针变量存放的又是另一个指针变量的地址,则称这个变量为指向指针的指针变量,也成为多级指针
例:int **p1=&p; 二级指针有两个**,三级有三个***
1 #include "stdio.h" 2 3 void main() 4 5 { 6 7 //一级指针 8 9 int a=5; 10 11 int *p=&a; 12 13 printf("&a=%p\n",&a); 14 15 printf("p=%p\n",p); 16 17 }
结果:
#include "stdio.h"
void main()
{
int a=5;
int *p=&a;
//二级指针
int **p1 = &p;
printf("&p=%p\n",&p);
printf("p1=%p\n",p1);
printf("-------------------\n");
printf("*p=%d\n",*p);
printf("*p1=%p\n",*p1);
printf("**p1=%d\n",**p1);
}
结果:
**5、指针类型**
定义什么类型的指针就应该指向什么类型的变量
**6、指针引用数组**
数组指针的作用:使用数组指针间接访问数组元素
数组指针的定义:int *p;
数组指针的初始化:int a[4]={1,2,3,4};
int *p=a;//数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素
int *p=&a[0];//等价于上边
数组指针如何访问数组的元素
1)p+1 表示指向数组的下一元素
2)p-1 指向数组的上一元素
总结:对于获取一个一维数组来说
int a[5];
1)获取a[i]的地址:
&a[i]
a+i
int *p=a;p+i;
2)获取a[i]的值:
a[i]
*(a+1)
int *p=a;*(p+i);
*(&a[I ])
例:用指针将数组a中n个整数按相反顺序存数
思路:将a[0]与a[n-1]对换……将a[4]与a[5]对换
注意:a[i]=*(a+i)
1 /* 用指针将数组a中n个整数按相反顺序存数 */ 2 3 #include <stdio.h> 4 //逆序数组 5 void nixu(int a[],int len){ 6 //定义数组指针 7 int *p=a; 8 //定义下标 9 int i=0,j=len-1; 10 int temp; 11 while(i<j){ 12 //交换a[i]和a[j] 13 temp=*(p+i); 14 *(p+i)=*(p+j); 15 *(p+j)=temp; 16 //修改下标 17 i++,j--; 18 } 19 } 20 void main(int argc,const char * argv[]) 21 { 22 int i; 23 int a[10]={1,2,3,4,5,6,7,8,9,10}; 24 //调用逆序数组 25 nixu(a,10); 26 //遍历数组 27 for(i=0;i<10;i++){ 28 printf("%d\t",a[i]); 29 30 } 31 }
结果:
**7、一维指针数组**
1、一个数组的元素值为指针,则是指针数组。指针数组是一个有序的指针的集合,指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组的一般式:类型说明符 *数组名[数组长度];
例:int *p[3];表示p是一个指针数组,有三个元素,每个元素都是一个指针,指向整型变量
1 #include <stdio.h> 2 void main(int argc,const char * argv[]) 3 { 4 int a=3,b=4,c=5; 5 int *p[3]={&a,&b,&c}; 6 //打印的是指针数组的第一个元素 7 printf("&a = %p\n",&a); 8 printf("p[0] = %p\n",p[0]); 9 //打印指针数组的首地址 10 printf("p = %p\n",p); 11 printf("&p[0] = %p\n",&p[0]); 12 //访问a的值 13 printf("*(&a) = %d\n",*(&a)); 14 printf("*(p[0]) = %d\n",*(p[0])); 15 //使用数组名来访问 16 printf("%d\n",**p); 17 }
结果: