指针上
一、初识指针
1.指针:用来存放地址的变量(存放在指针中的值都被当成地址处理)。
2.指针的大小:
32位的平台是4个字节
64位的平台是8个字节
3.指针的作用:
指针是为了存放地址才出现的,地址用来标示一块地址空间。当地址有地方可寻时,内存的访问也得到了便利。
4.指针的类型表示: type * 如 int*(指向int类型变量的指针) 、char*(指向char类型变量的指针)
指针类型的区别是为了便于确定指针的运算规律
(1)指针+-整数:由指针类型确定,指针向前或是向后走一步移动的距离。
如:char* p; p+1 则是移动一个字节,而 int* 则是移动4个字节。
(2)指针的解引用:指针的类型决定了,对指针解引用时能操作几个字节。
代码举例:
#include <stdio.h>
int main()
{
int num = 1;
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;
}
运行结果:
0019FF3C
0019FF3C
0019FF3D
0019FF3C
0019FF40
结果分析:
&num=pc=pi=0019FF3C
但是 pc+1=0019FF3D 即 0019FF3C+1 pi+1=0019FF40 即 0019FF3C+4 (pc:char*、pi:int*)
所以此处可以很直观的看到 char* p; p+1 则是移动一个字节,而 int* 则是移动4个字节。
二、指针在数组中的运用
指针+整数(移动的步数)可以替代,数组中 数组名+下标( a[i])的方式,得到数组元素的值。
举例:分别用数组和指针两种方式对 10个整数由大到小排序。(此处用简单选择排序的方法对数组进行排序)
#include <stdio.h>
/*
运行环境:vc++6.0
描述:分别用数组和指针两种方式对 10个整数由大到小排序。
*/
//数组_选择排序 升序
void sort1(int a[],int n);
//指针_选择排序 降序
void sort2(int* a,int n);
//输出
void output(int* a,int n);
int main()
{
int a[10]={1,4,3,2,5,6,8,7,9,0};
printf("原始数组:\n");
output(a,10);
printf("升序:\n");
sort1(a,10);
output(a,10);
printf("降序:\n");
sort2(a,10);
output(a,10);
return 0;
}
void sort2(int* a,int n)
{
int k=0;
int tmp=0;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(*(a+k)<*(a+j))
{
k=j;
}
}
if(k!=i)
{
tmp=*(a+k); *(a+k)=*(a+i); *(a+i)=tmp;
}
}
}
void sort1(int a[],int n)
{
int k=0;
int tmp=0;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(a[k]>a[j])
{
k=j;
}
}
if(k!=i)
{
tmp=a[k]; a[k]=a[i]; a[i]=tmp;
}
}
}
//输出
void output(int* a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n\n");
}
运行结果:
以上代码,我用了两种方式排序 指针和数组。看过代码后可以很容易的得出,实际上这两种排序的差异仅在对数组元素的获取方式上。a[i]==*(a+i); (在数组中数组名为数组的首地址)。因此可以得出,在数组中除了用数组名加下标的方式获取地址外还可以借助指针的方式获取数组元素。并且指针的方式效率能更高一些。、
三、了解二级指针
二级指针:用来存放指针变量的地址。
例:int a=10;
int* pa=&a;
int**ppa=&pa;
即:ppa指向的是存储pa的地址,也就是*ppa指向的是pa中存储的值,而pa内存储的也是一个地址,这个地址就是a的存储 地址。进而推出*ppa==pa=&a 。又由 *ppa指向的是存储a的地址。所以有: **ppa==*pa==a,**ppa则是*(*ppa) 指向的是 *ppa指向的地址 所指向的值也就是 a。
以上内容是全由个人对现阶段所学知识进行的总结整理,如果有任何问题欢迎指出!谢谢。