什么是指针:: 指针就是 内存地址
什么是指针变量 : 指针变量就是用来存放内存地址的变量
怎样定义指针变量: int / char /double + * +变量名 如 int *pum pum即为指针型变量
取地址符:& 当想用指针变量指向某一普通变量地址时,需要加&
int a=100;
int *pum=&a;
这时pum就指向了变量a的地址
当需要引用地址中存放的内容时 需要在指针变量pum前加*
在这里要注意 地址的值用16进制表示,而当我们定义一个变量为16进制时,那么每一个数字都是四位,最小为0,最大为f,如 int a=0x 23568af 那么这里面的2 3 a f 等都用四位存储,不满的填0,所以一个地址也就是一个字节最多存两个16进制的数字,另外补充一点,char类型的字符,每个字符都是一个字节,需要一个地址来存
*定义指针变量类型时编译器位数影响最大字节数
编译器64位时
编译器32位时
* 但是普通变量不会受编译器影响最大字节数
64位编译器时
32位编译器时
指针变量的初始化
int array[5]={1,2,3,4,5};
int*pum=array; //第一种初始化,将函数名赋给pum,那pum将初始化为array[0]的地址
int *pum=&array[4]; //第二种初始化,指定pum指向array[4]的地址,但注意要加&
当指针初始化为越界数组时那么会成为野指针,比如5个元素的数组,将指针变量初始化为第八个元素的地址,那么这时候会有地址,但地址存的内容是不确定的
*p(x++)和*px++的区别
*p(x++)是先x++后再取(x+1)的内容;
*px++是先取x的内容再进行x+1;
在用指针进行数组元素的互换时,一定记得是地址的内容间的更换而不是地址的更换,因为地址被开辟后就固定了,是无法更改的
习题
#include <stdio.h>
/*
输入十个整数,将最大值和最后一位互换,最小值与第一位互换(用指针和函数)
*/
void swap(int array[]);
void input(int array[]);
int main()
{
int i;
printf("请输入10个整数\n");
int array[10]={0};
input(array);
for(i=0;i<10;i++)
printf("%d ", array[i]);
printf("\n");
swap(array);
for(i=0;i<10;i++)
printf("%d ", array[i]);
return 0;
}
void input(int array[])
{
int i;
for(i=0;i<10;i++)
{
printf("请输入第%d个数\n", i+1);
scanf("%d", &array[i]);
}
}
void swap(int array[])
{
int max=0,min=100,min_i=0,max_i=0, i;
int *p,*pmx,*pmi;
int temp;
for(i=0;i<9;i++)
{
if(min>array[i])
{
min=array[i];
min_i=i;
}
}
for(i=0;i<9;i++)
{
if(max<array[i])
{
max=array[i];
max_i=i;
}
}
p=array;
pmi=&array[min_i];
temp=*pmi;
*pmi=*p;
*p=temp;
p=&array[9];
pmx=&array[max_i];
temp=*pmx;
*pmx=*p;
*p=temp;
}