Day5记录

本文详细介绍了指针的基本概念,如定义、操作过程以及如何通过指针改变变量值。还涵盖了指针与数组的关系,以及使用指针实现的各种操作,如数组遍历、排序和查找。
摘要由CSDN通过智能技术生成

 一.指针

1.1指针就是一种专门存放地址的数据类型

int i = 10;//在32位操作系统,在栈区开辟了一个四字节的空间存放变量i的值
int *p = &i;//在32位操作系统,在栈区开辟了一个四字节的空间p指针存放i的地址
printf("%d\n",*p);//*p表示访问i,将输出i的数值10

注意:

int *p表示定义p为整数型指针

*p中的*表示指针运算符,访问p指针中存放的地址i

指针类型需要与所存地址类型相同,int *p存放int类型数据地址

指针在不同操作系统中所占字节不同,在32位是4字节,64位8字节

 

1.2在主函数定义的变量,在调用其他函数若想改变主函数的变量可以通过指针实现

void fn(int a)
{
   a++;
}

void fn1(int *a)
{
   *a++;
}

int main()
{
   int i = 10;
   
   printf("%d\n",(fni));//显示的仍为10,函数进程结束后就会释放i
   printf("%d\n",fn1(i));//将显示的为11,i通过指针所保存的地址直接改变i的值

   return 0;
}

1.3指针运算符*操作过程:

 在指针中&与*可以相互抵消,但还是需注意*后面需要跟指针变量


int main(void)
{
	int i = 10;
	int *p = &i;

	printf("%p\n", &*p);//输出i的地址
	printf("%d\n", *&i);//输出变量i = 10
	printf("%p\n", *&p);//输出i的地址
	printf("%d\n", &*i);//无法编译 因为*要求操作对象必须为指针但i是整型
	return 0;
}

指针还可以强转数据类型,将字节大的数据类型强转为字节小的

p = (char *)&i;

注意:

指针可以进行加减操作

指针与指针间不能加法操作,但可以进行减法,判断两个指针的之间差了几个基类型

int i = 10;
int *p = &i;

p + 1;// p指针加上1*sizeof(基类型)字节,

1.4指针与数组

一维数组的数组名就是指针

int a[] = {1,2,3,4,5};
int *p;
p = a;//p = &a[0]

p += 1;//p = &a[1]

通过指针编写数组相关函数:

#include <stdio.h>

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

int sumOfArray(int *a, int len)
{
	int sum = 0, i;
	for(i = 0;i < len;++i)
	{
		sum += *(a + i);
	}
	return sum;
}

void swap(int *a,int *b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;
}

void reverseorder(int *a,int len)
{
	int i;
	for(i = 0;i < len / 2;i++)
	{
		swap((a + i),(a + len - i - 1));
	}
	for(i = 0;i < len;i++)
	{
		printf("%d\n",*(a + i));
	}
}

void ordersort(int *a,int len)
{
	int i;
	for(i = 0;i < len - 1;i++)
	{
		for(int j = i + 1;j < len;j++)
		{
			if(*(a + i) > *(a + j))
			{
			     swap(a + i,a + j);
			}
		}
	}
	for(i = 0;i < len;i++)
	{
		printf("%d ",*(a + i));
	}
}
 
void maopaosort(int *a,int len)
{
	int i,j;
	for(i = len - 1;i > 0;i--)
	{
		for(j = 0;j < i;j++)
		{
			if(*(a + j) > *(a + j + 1))
			{
				swap(a + j,a + j + 1);
			}
		}
	}
	for(i = 0;i < len;i++)
	{
		printf("%d ",*(a + i));
	}
}

void insertsort(int *a,int len)
{
	int i,j;
	for(i = 1;i < len;i++)
	{
		int t = *(a + i);
		j = i;
		while(j > 0 && *(a + j - 1) > t)
		{
			*(a + j) = *(a + j - 1);
			j--;
		}
		*(a + j) = t;
	}
	for(i = 0;i < len;i++)
	{
		printf("%d ",*(a + i));
	}
}
int *midFind(int *a,int len,int n)
{
	int begin = 0;
	int end = len - 1;

	while(begin <= end)
	{
         	int mid = (begin + end) / 2;
		if(*(a + mid) > n)
		{
			end = mid  - 1;
		}
		else if(*(a + mid) < n)
		{
			begin = mid + 1;
		}
		else
		{
			return a + mid;

		}
		
		return NULL;
		
	}
}

int main()
{
	int a[] = {1,-2,3,-4,5,-6,7,-8,9,0};
	int len = sizeof(a) / sizeof(a[0]);
        
//	maopaosort(a,len);

//	insertsort(a,len);
      //  reverseorder(a,len);
        ordersort(a,len);
	int *ret = midFind(a,len,-6);
	if(ret == NULL)
	{
		printf("not found\n");
	}
	else
	{
		printf("%p %d\n",ret,*ret);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值