0725学习笔记(指针)

指针的概念

        指针就是地址,指针变量就是存在地址编号的变量

        整形变量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=&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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值