指针的概念
指针就是地址,指针变量就是存在地址编号的变量
整形变量int a;a占四个字节,一般只研究首地址
指针的定义方法
int *p;//定义了一个整形类型的指针变量p
数据类型 *指针变量名
指针的运算符
&取地址、*取值
int a=0x12345678;
int *p; //定义指针变量,用*修饰
p=&a; //把a的地址赋给p
#include <stdio.h>
int main()
{
int *pum_01;//定义一个整形地址
int *pum_02;
int *pum_03=NULL;//定义指针变量,指向空
int a=123;//定义一个整形变量
printf("变量a的值=%d\n",a);
printf("变量a的地址=%#p\n",&a);
pum_01=&a;//a的地址赋给pum_01
printf("指针变量pum_01的值=%#p\n",pum_01);
printf("指针变量pum_01的值所指向地址的内容=%d\n",*pum_01);
//指针变量未进行初始化,是非法指针
printf("指针变量pum_02的值=%#p\n",pum_02);
printf("指针变量pum_02的值所指向地址的内容=%d\n",*pum_02);
printf("指针变量pum_03的值=%#p\n",pum_03);
printf("指针变量pum_03的值所指向地址的内容=%d\n",*pum_03);
return 0;
}
结果
变量a的值=123
变量a的地址=0X0061FE90
指针变量pum_01的值=0X0061FE90
指针变量pum_01的值所指向地址的内容=123
指针变量pum_02的值=00000000
--------------------------------
Process exited after 0.9555 seconds with return value 3221225477
请按任意键继续. . .
指针的分类
字符指针、短整型指针、整形指针、长整形指针、float型指针、double型指针、函数指针、结构体指针、指针的指针、数组指针
#include <stdio.h>
int main()
{
char ch='1';//定义char类型ch,存储字符1
char *p_ch=&ch;//字符型指针变量,定义并初始化
printf("ch变量的内容是:%c\n",ch);
printf("ch变量的内容是:%c\n",*p_ch);
int num=2;
int *p_num;//也可先定义后初始化
p_num=#
printf("num变量的内容是:%d\n",num);
printf("num变量的内容是:%d\n",*p_num);
return 0;
}
ch变量的内容是:1
ch变量的内容是:1
num变量的内容是:2
num变量的内容是:2
--------------------------------
Process exited after 0.04656 seconds with return value 0
请按任意键继续. . .
通过指针方式,交换变量a,变量b的值
#include <stdio.h>
void sp(int *num_01,int *num_02);
/*
交换a,b的值通过指针的方式
*/
int main()
{
int a=10,b=20;
int *p=NULL;
int *p_a=&a;
int *p_b=&b;
printf("p_a保存的内容=%d\n",*p_a);
printf("p_b保存的内容=%d\n",*p_b);
p=p_a;
p_a=p_b;
p_b=p;
printf("p_a保存的内容=%d\n",*p_a);
printf("p_b保存的内容=%d\n",*p_b);
printf("\n\n");
printf("变量a的内容=%d\n",a);
printf("变量b的内容=%d\n",b);
sp(&a,&b);
printf("变量a的内容=%d\n",a);
printf("变量b的内容=%d\n",b);
return 0;
}
void sp(int *num_01,int *num_02)
{
int temp;
temp=*num_01;
*num_01=*num_02;
*num_02=temp;
}
结果
p_a保存的内容=10
p_b保存的内容=20
p_a保存的内容=20
p_b保存的内容=10
变量a的内容=10
变量b的内容=20
变量a的内容=20
变量b的内容=10
--------------------------------
Process exited after 0.05292 seconds with return value 0
请按任意键继续. . .
强制转换和指针下移
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int i;
int *p=NULL;
printf("a[0]的地址:%#p\n",&a[0]);
p=&a[0];//用0号元素的地址初始化
printf("指针变量p的值:%#p\n",p);
p=a;//用数组名初始化
printf("指针变量p的值:%#p\n",p);
for(i=0;i<5;i++)
{
p++;
printf("指针变量p的值:%#p\n",p);
printf("指针变量p的值所指向的内容:%d\n",*p);//会溢出
}
printf("\n\n");
p=a;
for(i=0;i<5;i++)
{
printf("指针变量p的值:%#p\n",p);
printf("指针变量p的值所指向的内容:%d\n",*p);
p++;
}
printf("\n\n");
int c=0x12345678;
char *ch;
ch=(char *)&c;//强制转换
printf("指针变量ch的值:%#p\n",ch);
printf("指针变量ch的值所指向的内容:%#x\n",*ch);
ch++;
printf("指针变量ch的值:%#p\n",ch);
printf("指针变量ch的值所指向的内容:%#x\n",*ch);
ch++;
printf("指针变量ch的值:%#p\n",ch);
printf("指针变量ch的值所指向的内容:%#x\n",*ch);
ch++;
printf("指针变量ch的值:%#p\n",ch);
printf("指针变量ch的值所指向的内容:%#x\n",*ch);
return 0;
}
结果
a[0]的地址:0X0061FE80
指针变量p的值:0X0061FE80
指针变量p的值:0X0061FE80
指针变量p的值:0X0061FE84
指针变量p的值所指向的内容:2
指针变量p的值:0X0061FE88
指针变量p的值所指向的内容:3
指针变量p的值:0X0061FE8C
指针变量p的值所指向的内容:4
指针变量p的值:0X0061FE90
指针变量p的值所指向的内容:5
指针变量p的值:0X0061FE94
指针变量p的值所指向的内容:0
指针变量p的值:0X0061FE80
指针变量p的值所指向的内容:1
指针变量p的值:0X0061FE84
指针变量p的值所指向的内容:2
指针变量p的值:0X0061FE88
指针变量p的值所指向的内容:3
指针变量p的值:0X0061FE8C
指针变量p的值所指向的内容:4
指针变量p的值:0X0061FE90
指针变量p的值所指向的内容:5
指针变量ch的值:0X0061FE7C
指针变量ch的值所指向的内容:0x78
指针变量ch的值:0X0061FE7D
指针变量ch的值所指向的内容:0x56
指针变量ch的值:0X0061FE7E
指针变量ch的值所指向的内容:0x34
指针变量ch的值:0X0061FE7F
指针变量ch的值所指向的内容:0x12
--------------------------------
Process exited after 0.05635 seconds with return value 0
请按任意键继续. . .
指针数组
指针和数组的关系
指针可以保存数组元素的地址
#include <stdio.h>
int main()
{
int *p[3];//指针数组,本质是一个数组,元素内容是指针变量
int a,b,c;
p[0]=&a;
p[1]=&b;
p[2]=&c;
a=100;
b=200;
c=300;
printf("变量a的地址%#p,a的内容%d\n",&a,a);
printf("p[0]存放的地址%#p,内容%d\n",p[0],*p[0]);
printf("变量b的地址%#p,b的内容%d\n",&b,b);
printf("p[1]存放的地址%#p,内容%d\n",p[1],*p[1]);
printf("变量c的地址%#p,c的内容%d\n",&c,c);
printf("p[2]存放的地址%#p,内容%d\n",p[2],*p[2]);
return 0;
}
结果
变量a的地址0X0061FE90,a的内容100
p[0]存放的地址0X0061FE90,内容100
变量b的地址0X0061FE8C,b的内容200
p[1]存放的地址0X0061FE8C,内容200
变量c的地址0X0061FE88,c的内容300
p[2]存放的地址0X0061FE88,内容300
--------------------------------
Process exited after 0.04483 seconds with return value 0
请按任意键继续. . .
一般情况下,指针数组都用来保存多个字符串
#include <stdio.h>
int main()
{
char *name[5]={"is","she","him","xiao","da"};
int i;
for(i=0;i<5;i++)
{
printf("%s\n",name[i]);
}
return 0;
}
指针数组的分类
字符指针数组、短整型指针数组、整型指针数组、长整型、float、double、结构体、函数
#include <stdio.h>
/*
通过指针变量,打印出数组a[10]的10个元素
*/
int main()
{
int a[10]={0};
int i=0;
for(i=0;i<10;i++)
{
a[i]=i+100;
}
int *p=a;
for(i=0;i<10;i++)
{
printf("数组a[%d]=%d\n",i,*p);
p++;
}
return 0;
}