指针的讲解使用(习题)

计算机基础:
1、组成:CPU,存储,I/O
2、CPU:执行指令。
3、程序:就是有限指令的集合(外存中)
   进程:正在运行的程序(CPU会通过文件系统去将外存中的程序加载到内存并分配空间)

存储单元:
    1最小的存储单元:bit      (存放0/1)
    2计算机的存储基本单元:byte      (每次一次性取出的宽度)
    3其他单位: KB=1024Byte=2^10Byte
            1MB=1024KB=2^10KB=2^20Byte=2^23bit
          1GB=1024MB=2^10MB
    注:8GB=1024*8MB=2^13MB=2^23KB=2^33Byte     

4、物理地址:内存条上连续的编号
5、指针:就是地址
6、变量:
    整型变量: int a=3    整型变量:专门存放整型的值
    指针变量:             指针变量:专门存放指针的变量
        定义: 类型* 变量名;
      引用指针变量:引用内容    (注:引用指针内容的长度取决于指针的类型)
    注:所有指针变量都为4Byte 

7、通过指针修改空间的内容: *pb=100;

9、空指针: null
8、(***)指针的运算:  +  -   注:指针指向的元素地址 
     int* pa;
     pa+n==pa+sizeof(int)*n        ;指针是指向的元素的地址,p+n代表是向后移动4个元素
     pa-n==pa-sizeof(int)*n        ;指针是指向的元素的地址,p+n代表是向前移动4个元素

9、数组与指针:
  9.1指针与数组的关系:
  定义数组:类型 数组名[长度]  
  概念:连续且同类型的存储空间
  数组名:就是此数组空间的首地址
  9.2指针变量与数组的关系:

运算符:
1、取变量地址:  &变量
2、引用地址的内容:   *指针

#include<stdio.h>

void main()
{
//定义普通变量:分配空间
	int a=100;
	printf("sizeof(a)=%d ,&a=0x%x\n",sizeof(a),&a);
//引用变量:取出变量的内容 (1、作用域  2、生命周期)
	printf("a=%d\n",a);
//定义指针变量:专门用于存放指针的变量	(分配空间)
	int* pa=&a;
	printf("sizeof(pa)=%d , &pa=0x%x\n",sizeof(pa),&pa);
//引用变量:引用变量的内容
	printf("pa=%x  &a=%x *(&a)=%d *pa=%d\n",pa,&a,*(&a),*pa);
}

      short指针指向int的变量

#include<stdio.h>

void main()
{
//定义普通变量:
	int a=65537;	//为什么需要类型:分配 4Byte
	short b=257;	//2Byte
//定义指针变量:分配空间(专门用于存放地址) 类型* 变量名;
	int* pa=&a;
	printf("sizeof(pa)=%d\n",sizeof(pa));
	short* pb=&b;
	printf("sizeof(pb)=%d\n",sizeof(pb));

//引用内容: a
	printf("a=%d,&a=0x%x,pa=0x%x,*pa=%d\n",a,&a,pa,*(pa));
	printf("b=%d,&b=0x%x,pb=0x%x,*pb=%d\n",b,&b,pb,*pb);

//定义short指针指向int的变量
	short* pc=&a;		//pc的空间4Byte

	printf("*pa=%d\n",*pa);	//*pa=65537 
	printf("*pc=%d\n",*pc);	//*pc=00000000 00000001

	int* pd=&b;
	printf("*pd=%d\n",*pd);
}

        引用数组元素,通过变量引用元素内容

#include<stdio.h>

void main()
{
//定义数组:   类型 数组名[长度]	“连续”且同类型的存储
	int buf[10]={1,2,13,4,5,6,7,8,9,10};
//引用数组元素:下标法--数组下标是从0开始的
//	printf("%d %x %x %x\n",buf[0],&buf[0],&buf[1],buf);
//引用元素内容:下标法  指针法
//	printf("%x %x %d\n",&buf[2],buf+2,*(buf+2));

//指针变量:
	int* pa=buf;

//通过变量引用元素内容
	printf("%x %x %d %d\n",buf,pa,*(buf+0),*pa);	
//第三个元素:
	printf("%d %d %d %d\n",buf[2],*(buf+2),*(pa+2),pa[2]);
}

习题:

        将int a=67305985的每一个字节内容输出打印。

#include<stdio.h>
void main()
{
    int a = 67305985,i=0;
    int* pa = &a;
    char* pb=*(char*)pa;
    for(i=0;i<4;i++)
    printf("%d\n",pb+i);
}

习题:

        通过pa来求数组和int buf[10] = {1,2,3,4,5,6,7,8,9,10}; 倒着打印

#include<stdio.h>
void main()
{
	int buf[10] = {1,2,3,4,5,6,7,8,9,10};
//通过pa地址倒着打印 通过pa来求数组元素的和
	int* pa = buf;
	int i = 0,b = 0;
	for(i=9;i>=0;i--){
	printf("%d\n",*(pa+i));
	b = b + *(pa+i);}
	printf("和:%d\n",b);
}

  习题:

         通过pa指针变量来实现二分查找法   (int*left ,int* right)

#include<stdio.h>
void main()
{
//二分法(折半查找):
//1,确定左右区域并指向中间值
//2,key>mid 右侧  key<mid  左侧

	int buf[10] = {1,2,3,4,5,6,7,8,9,10};

	int* left=buf,*right=buf+9,*mid=NULL;
	int key=3;
        if(key>*right || key<*left)
        printf("不存在");
	while(*left<*right)
	{
		mid=left+(right-left)/2;
		if(key>*mid)//右侧
		{
			left=mid+1;
		}
		else if(key==*mid)//成功
		{
			printf("查找成功:%d\n",*mid);
			break;
		}
		else//左侧
			right=mid-1;
	}

习题:

        通过指针实现,插入排序.

#include<stdio.h>

void main()
{
	int a[10] = {1,5,6,8,2,3,7,4,9};
	
	int i=0,j=0,temp;
	for(i=1;i<9;i++)
	{
		j=i;
		temp = *(a+i);
		if(*(a+j)<*(a+j-1))
		{
			while(j>0 && temp<*(a+j-1))
			{
				*(a+j)=*(a+j-1);
				j--;
			}
			*(a+j)=temp;
		}
	}

	for(i=0;i<9;i++)
	{
		printf("%d\n",*(a+i));
	}
}

猜你喜欢

转载自blog.csdn.net/superman___007/article/details/81139815