嵌入式学习--C语言Day08

嵌入式学习--C语言Day08

数组指针

格式

访问

大小

指针数组

格式

访问

大小

命令行参数

函数

定义

函数声明

函数调用

格式

不需要返回值,不需要参数

不要需要返回值,需要参数

需要返回值,需要参数

函数传参

值传递

地址传递

数组指针

本质是指针,指向数组 行指针

格式

存储类型 数据类型 (*指针变量名)[列数]

访问

int a[2][3] = {2,3,4,5,6,7};
int (*p)[3] = a;
printf("%p\n",a);
printf("%p\n",a+1);
printf("%p\n",p);
printf("%p\n",p+1);
//==========================
printf("%p\n",*a);
printf("%p\n",*a+1);
printf("%p\n",*p);
printf("%p\n",*p+1);
printf("%p\n",*(p+1));
printf("%p\n",*(p+1)+1);

地址

元素

p[0]

p

*p

2

**p

*p[0]

p[0]+1

*p+1

3

*(*p+1)

*(p[0]+1)

p[0]+2

*p+2

4

*(*p+2)

*(p[0]+2)

p[1]

p+1

*(p+1)

5

*(*(p+1))

*p[1]

p[1]+1

*(p+1)+1

6

*(*(p+1)+1)

*(p[1]+1)

p[1]+2

*(p+1)+2

7

*(*(p+1)+2)

*(p[1]+2)

a和p本质不同,a是指针常量,不能修改,p是指针变量,可修改

访问二维数组的地址:i 行 j 列

*(p+i)+j p[i]+j &a[i][j]

访问二维数组元素的值:

a[i][j] *(*(p+i)+j) *(p[i]+j)

遍历二维数组int a[3][4] = {};

int a[3][4] = {2,3,4,5,6,7,8,5,4,2,12,45};
int (*p)[4] = a;
for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 4; j++)
	{
		printf("%d ",a[i][j]);
		printf("%d ",*(p[i]+j));
		printf("%d ",*(*(p+i)+j));
	}
}
//2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 5 5 5 4 4 4 2 2 2 12 12 12 45 45 45

大小

32位系统:4

64位系统:8

指针数组

本质是数组,数组中存放地址

格式

存储类型 数据类型 *数组名[]

访问

存放普通变量的地址

int a = 10,b = 20, c = 30;
int *p[3] = {&a,&b,&c};
//打印20
printf("%d\n",*p[1]);//p[1]访问数组中第二个元素内容(&b),再加*,取内容(*&b)
printf("%d\n",*(p[0]+1));//p[0]数组的第一个元素,+1到了第二个元素,再加*取内容
printf("%d\n",*(*p+1));//*arr第一个元素,+1到了第二个元素,再加*取内容

存放二维数组每一行第一列的地址

int a[3][4] = {2,3,4,5,6,7,8,9,10,11,21};
int *p[4] = {a[0],a[1],a[2]};
//a[1][0]
printf("%d\n",a[1][0]);
printf("%d\n",**(a+1));
printf("%d\n",*p[1]);//p[1]:指针数组的第二个元素(a[1]二维数组的第二行第一列的地址)
printf("%d\n",p[1][0]);
printf("%d\n",**(p+1));//p+1指针数组的第二个元素的地址,*(p+1)指针数组的第二个元素de值==a[1]
printf("%d\n",*(*(p+1)));
//a[1][2]
printf("%d\n",a[1][2]);
printf("%d\n",*(a[1]+2));
printf("%d\n",*(*(a+1)+2));
printf("%d\n",p[1][2]);
printf("%d\n",*(p[1]+2));//p[1]:指针数组的第二个元素(==a[1]地址==a[1][0]地址), p[1]+2(a[1][2])
printf("%d\n",*(*(p+1)+2));//p+1:指针数组的第二个元素的地址,*(p+1)加*取针数组的第二个元素的内容(==a[1]地址==a[1][0]地址), *(p+1)+2
char *a[3] = {"hello","world","saf"};
//打印world
printf("%s\n",a[1]);
printf("%s\n",*(a+1));
//打印'd'
printf("%c\n",a[1][4]);
printf("%c\n",*(a[1]+4));
printf("%c\n",*(*(a+1)+4));

大小

元素个数*8

命令行参数

argv :指针数组,存放命令行传递的字符串

argc :命令行传递的字符串de个数

#include<stdio.h>
int main(int argc, char const *argv[])
{
    printf("%s\n",argv[1]);
    printf("%d\n",argc);
    return 0;
}

函数

功能、参数、返回值

返回值可有可无

定义

数据类型 函数名(形式参数...)

{

        //函数体

}

函数声明

当函数写在主函数的下面,需要提前声明;

数据类型 函数名(形式参数);

函数调用

函数名(实际参数);

格式

数据类型需要和返回值数据类型一致,如果没有返回值,数据类型用void定义

不需要返回值,不需要参数

void fun();

void fun()
{
	
)
int main()	//程序入口
{
fun();		//函数调用
	return 0;
}

不要需要返回值,需要参数

void fun(int a,int b);

void fun(int n1,int n2)
{
    int sum=n1+n2;
    printf("%d\n",sum);
}
int main(int argc, char const *argv[])
{
    int a=5,b=9;
    fun(8,9);
    fun(a,b);
    return 0;
}

需要返回值,需要参数

int fun(int a, int b);

#include<stdio.h>
int fun(int n1,int n2);	//先声明
int main(int argc, char const *argv[])
{
    int a=5,b=9;
    int res = fun(8,9);
    fun(a,b);
    printf("res:%d\n",res);
    return 0;
}

int fun(int n1,int n2)
{
    int sum=n1+n2;
    printf("%d\n",sum);
    return sum;
}

函数传参

#include<stdio.h>
void fun(int *n1,int n2)
{   //int *n1=&a;
    *n1=99;
}
int main(int argc, char const *argv[])
{
    int a=5,b=9;
    fun(&a,b);
    printf("%d\n",a);//99
    return 0;
}

值传递

地址传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值