十.指针
10.1 指针基本用法
程序简洁,紧凑,高效
有效的表达复杂的数据结构
动态分配内存
得到多余一个的函数返回值
计算机内存中,每一个字节单元都有一个编号,称为地址
编译或函数调用时为其分配内存单元
10.2 指针的概念
内存单元的地址称为指针,用来存放地址的变量。(地址==指针)
<数据类型> *<指针变量名>
指针变量是个变量
char *pname;
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a = 10;
int *pa;
pa = &a;
printf("a = %p pa = %p pa = %d %p\n",&a,pa,*pa,&pa);
return 0;
}
10.3 指针的含义
指针指向的内存区域中的数据称为指针的目标
如果它指向的区域是程序的一个变量的内存空间,则这个变量称为指针的目标变量,简称为指针的目标
px,指针变量,它的内容是地址量
*px,指针所指向的对象,它的内容是数据
&px,指针变量占用的存储区域的地址,是一个常量
指针的赋值运算指的是通过赋值运算符指针变量送一个地址值
向一个指针变量赋值时,送的值必须是地址常量或指针变量
什么是指针?指针是内存单元的地址
指针有多少字节?8个
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 10;
int *pa,*pb,*pc;
int c[10];
pa = &a;
pb = pa;
pc = &c[0];
printf("a = %p\n pa = %p\n pb = %p\n pc = %p",&a,pa,pb,pc);
return 0;
}
10.4 指针运算
指针运算是以指针变量所存放的地址量作为运算量而进行的运算
指针运算的实质就是地址的计算
指针运算的种类是有限的,它只能进行赋值运算、算数运算和关系运算。
两个指针相减运算
px-py运算的结果是两个指针指向的地址位置之间相隔数据的个数
两个指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据的个数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10] = {1,2,3,4,5};
int *pa,*pb;
pa = &a[3];
printf("pa = %d\n",*pa);
pb = pa++;
printf("pa = %d pb = %d\n",*pa,*pb);
pb = pa-2;
printf("pa = %d pb = %d",*pa,*pb);
return 0;
}
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a[5] = {1,2,3,4,5};
int *pa,*pb;
pa = a;
printf("pa =%d\n",*pa);
pb = pa++;//pa先赋值给pb,再自增
printf("pb = %d,pa = %d\n",*pb,*pa);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[] = {1,2,3,4,5};
int *pa;
pa = &a[2];
pa++;
printf("%d ",pa[1]);
return 0;
}
10.5 指针和数组
数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址
一维数组的数组名为一维数组的指针
本质不同:指针变量是地址变量,数组的指针是地址常量//常量不能自增,a++ = a+1,a-- = a-1;
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a[] = {1,2,3,4,5};
int i,n,*p;
p = a;
n = sizeof(a)/sizeof(int);
for(i=0;i<n;i++)
{
printf("%d %d %d %d\n",a[i],*(p+i),p[i],*(a+i));
}
return 0;
}
数组元素反序
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a[] = {1,2,3,4,5};
int *p1,*p2,n,i,t;
n = sizeof(a)/sizeof(int);
p1 = a;
p2 = &a[n-1];//指针变量存放地址
while(p1<p2)
{
t = *p1;
*p1 = *p2;
*p2 = t;
p2--;
p1++;
}
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
return 0;
}