C语言笔记第九天

目录

多维数组

多级指针

指针作为参数

交换两个变量

函数内部改变指针

一维数组作为参数


多维数组

#include <stdio.h>

int main(int argc,char * argv[])
{
	//任何数组实际上在物理内存上都是一维的,之所以我们把它分为一,二,三维数组是在逻辑层面上
	//对了数组是一段连续的空间,这个居然一直没有说过!!!
	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

	//这个说没说过 忘记了 反正说下准没错
	//&arr arr &arr[0][0]地址是一样的,但是表示的不一样
	//&arr是整个数组的首地址,步长为整个数组
	printf("%u\n", &arr);
	printf("%u\n", &arr + 1);

	//arr是数组的第一个元素地址,他的第一个元素为一个一维数组,步长为16
	printf("%u\n", arr);
	printf("%u\n", arr + 1);

	//&arr[0][0]是arr[0][0]的地址,步长为4
	printf("%u\n", &arr[0][0]);
	printf("%u\n", &arr[0][0] + 1);

	int* p = &arr[0][0];

	//指针遍历
	for (int i = 0; i < 12; ++i)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");

	//遍历
	for (int i = 0; i < 12; ++i)
	{
		printf("%d ", p[i]);
	}
	printf("\n");

	for (int i = 0; i < 12; ++i)
	{
		//这样不可以 还记得 []是*()的简化版本嘛 这个很重要哦
		//arr[i] = *(arr+i) 
		//arr是数组的首元素地址,在二维数组中他是一个一维数组,步长是这个一维数组
		//printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

多级指针

#include <stdio.h>

int main(int argc,char * argv[])
{
	//多级指针
	int num = 10;
	int* p = &num;
	int** pp = &p;
	int*** ppp = &pp;

	//打印的都是 num的地址 num的值

	printf("&num = %p\n", &num);
	printf("num = %d\n", num);

	printf("p = %p\n", p);
	printf("*p = %d\n", *p);

	printf("*pp = %p\n", *pp);
	printf("**pp = %d\n", **pp);

	printf("**ppp = %p\n", **ppp);
	printf("***ppp = %d\n", ***ppp);

	return 0;
}

指针作为参数

交换两个变量

#include <stdio.h>

void swap1 (int num, int num2);
void swap2(int* num, int* num2);

int main(int argc,char * argv[])
{
	//指针作为参数,可以在函数内部修改变量
	//改变普通变量需要一级指针,改变指针需要二级指针
	int num = 10;
	int num2 = 20;

	//传值无法交换
	//因为传递函数相当于赋值操作,这个之前有说过
	swap1(num, num2);
	printf("num = %d,num2 = %d\n", num, num2);	//10 20

	//其实传递地址,也是赋值操作,但是按照地址寻找的空间时同一个空间(内存)
	swap2(&num, &num2);
	printf("num = %d,num2 = %d\n", num, num2);	//20 10

	return 0;
}

void swap1(int num, int num2)
{
	//这个交换应该不用说吧,内存是两个空间(两杯水)
	//相互交换需要第三个空间(第三杯)
	int temp = num;
	num = num2;
	num2 = temp;
}

void swap2(int* num, int* num2)
{
	int temp = *num;
	*num = *num2;
	*num2 = *num;
}

函数内部改变指针

#include <stdio.h>

void changeThePointer(int** pp);

int main(int argc,char * argv[])
{
	int* p = NULL;

	//传递一级指针的地址
	changeThePointer(&p);

	printf("*p = %d\n", *p);

	return 0;
}

void changeThePointer(int** pp)
{
	int num = 10;
	*pp = &num;
}

一维数组作为参数

#include <stdio.h>

//数组作为函数传递时会弱化为指针
void callArray(int arr[5]);

//和上面声明是等价的
//void callArray(int* arr);

int main(int argc,char * argv[])
{
	int arr[5] = { 1,2,3,4,5 };

	printf("%d\n", sizeof(arr));	//20

	callArray(arr);

	return 0;
}

void callArray(int arr[5])
{
	//传进来的就是一个指针(首地址)所以是四个字节,这个面试中有时候会出现哦
	printf("%d\n", sizeof(arr));	//4
}

我要为自己狡辩一下,昨天我真的有写,只是忘记发送了而已.....

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值