指针数组
指针数组,首先它是一个数组,数组里面的存储的是一个个指针,例如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;
}
当我们把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;
}
数组指针
数组指针,首先它是一个指针,这个指针的类型是一个有长度的数组,如果我们把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;
}
因为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;
}
形参和实参
形参只是一个个变量,而实参都是一个个实际的值。我们在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;
}
显而易见,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;
}
成功修改a的值。传递地址能打破作用域的限制