指针的学习(1)二级指针和数组

一,二维数组和二级指针的关系

重要一点是*p就是一维数组的首地址

二级指针和数组的关系:
arr[3][4] 是一个二维数组 把二维数组的首地址给二级指针**p

  1. 那么一个星的*p就是就是arr[0]的地址, (p + 1)就是arr[1]的地 址 ((p + 1)+ 2)是arr[1][2]的地址
  2. arr[1] 就是*(p + 1) , arr[1][2] =====((p + 1) + 1)

/*************************************************************************
	> File Name:
	> Author: songli陈松songli
	> QQ:2734030745
	> Mail: 15850774503@163.com
	> Created Time:
 ************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>



int main(int argc, char *argv[])
{

	int arr[][6] = 
	{
		{ 2, 4, 5, 6, 7, 8,},
		{ 20, 40, 50, 60, 7000, 8000 },
		{ 200, 400, 50, 6000, 7000, 8000 },
		{ 2000, 4000, 5000, 6000, 7000, 8000 }
	};


	printf("**arr= %d\n", *(*(arr + 3) + 1));// *(arr + 3) 就是一个地址
	printf("%d\n", *(arr[3] + 2));     //arr[3] 就是一个地址 
	printf("\n");
	system("pause");
	return EXIT_SUCCESS;
}

效果图
这里写图片描述

二,二级指针冒泡排序

分析思路

比较地址

这里写图片描述


/*************************************************************************
	> File Name:
	> Author: songli
	> QQ:2734030745
	> Mail: 15850774503@163.com
	> Created Time:
 ************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


#define N 9




int main(int argc, char *argv[])
{

	int arr[N];

	int *p, *q;
	int *tmp = (int *)malloc(sizeof(int) * 1);
	for (p = arr; p - arr < N; p++)
		scanf("%d", p);

	for (p = arr; p - arr < N; p++)
		printf("arr[%d] = %d \n", p, *p);

	int *pos;
	for (p = arr; p - arr < N - 1; p++)
	{
		
		for (q = p + 1; q - arr < N ; q++)
		{
			pos = p; //地址
			if (*q < *p)   //比较两个值得大小
			{
				pos = q ;
			}

			if (pos != p)
			{
				*tmp = *pos;
				*pos = *p;
				*p = *tmp;
			}
		}
	}
	for (p = arr; p - arr < N; p++)
		printf("arr[%d] = %d \n", p, *p);


	printf("\n");
	system("pause");
	return EXIT_SUCCESS;
}

三, 指针数组的考察

#include<iostream>
int main(int argc, char *argv[])
{
	int n[][3] = { 10, 20, 30, 40, 50, 60};
	int (*p)[3];
	p = n;
	cout << p[0][0] << "," << *(p[0] + 1) << ", " << (*p)[2] << endl;
	return 0;
}

输出的结果:

 10,20,30

还是上面说 *p就是 n[0]

修改一下


#include<iostream>
int main(int argc, char *argv[])
{
	int n[][3] = { 10, 20, 30, 40, 50, 60};
	int (*p)[3];
	p = n;
	std::cout << p[0][0] << "," << *(p[0] + 1) << ", " << (*p)[2] << std::endl;
	
	std::cout << p[1][0] << "," << *(p + 1)[0] << std::endl;
	return 0;
}

输出结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值