指针数组,数组指针,函数

指针数组

指针数组,首先它是一个数组,数组里面的存储的是一个个指针,例如int* p[5];,指针数组里面的元素大小都是一样的,都是一个指针的大小,也就是8个字节(64位机器),sizeof(p);就为40个字节。下标的本质:下标的本质就是偏移量,[]的含义是解引用

#include <stdio.h>

int main(void)
{
	int* p[5];
	printf("数组p的大小:%zd\n", sizeof(p));

	return 0;
}

image
当我们把p+1后,它与p之间就差了一个指针大小也就是8个字节。

#include <stdio.h>

int main(void)
{
	int* p[5];
	printf("p=%p\n", p);
	printf("p+1=%p\n", p+1);

	return 0;
}

image

数组指针

数组指针,首先它是一个指针,这个指针的类型是一个有长度的数组,如果我们把p+1后,它与p之间就会差数组元素个数的大小,例如int(*p)[3];

#include <stdio.h>

int main(void)
{
	int(*p)[3];
	printf("p=%p\n", p);
	printf("p+1=%p\n", p+1);

	return 0;
}

image
因为int(*p)[3];里面有三个int大小也就是12个字节,所以p+1就多了12个字节。

函数

函数是C语言的基本组成单位,首先是函数的定义,函数里面封装的都是一段逻辑代码,用来处理事务的,定义好后,就直接在main函数中调用即可,大大增强了代码的复用。定义格式:

函数返回值类型 函数名(参数类型 参数名){

}

函数名可采用驼峰命名法和匈牙利命名法。例如我们定义一个计算两个数相加的函数

#include <stdio.h>

int addNum(int a, int b)
{
	return a + b;
}


int main(void)
{
	printf("%d\n", addNum(2,3));
	
	return 0;
}

image

形参和实参

形参只是一个个变量,而实参都是一个个实际的值。我们在main函数中创建并初始化一个变量。我们在函数中的任何运算都不会影响它本身的值,因为我们的作用域不同。

#include <stdio.h>

void addNum(int a)
{
	a = 20;
}


int main(void)
{
	int a = 10;
	printf("修改前a的值:%d\n", a);
	addNum(a);
	printf("修改后a的值:%d\n", a);
	
	return 0;
}

image
显而易见,a的值并未修改,因为main函数里的a和addNum里的a不是同一个a。如果要想修改它,那么我们可以把a的地址当做参数传给函数,这样我们就能在函数内成功修改a的值。

#include <stdio.h>

void modify(int* p)
{
	*p = 20;
}
int main(void)
{
	int a = 10;
	printf("修改前a的值:%d\n", a);
	modify(&a);
	printf("修改后a的值:%d\n", a);
	
	return 0;
}

image
成功修改a的值。传递地址能打破作用域的限制

posted @ 2023-07-14 21:32  若达萨罗  阅读(31)  评论(0)    收藏  举报