搭配VC++学习效果更佳
知识补充
在学习指针和数组之前,先了解一个概念,int/short/long/char在机器中占用了几个字节,Windows系统中,int占用4个字节,short占用2个字节,char占用1个字节,这几个在Linux系统中占用的字节是一样的,不过对于long来说,windows系统中占用4个字节,linux系统64位会占用8个字节,而long long都是一样的,也占用8个字节,所以对于8字节来说,统一用long long。
在进行UEFI代码编程的时候,通常只会出现UINTN/UINT8/CHAR16...等等定义,通过上述说明,就能理解这些定义的逻辑了
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned int UINT32;
typedef int INT32;
typedef unsigned short UINT16;
typedef unsigned short CHAR16;
typedef short INT16;
typedef unsigned char BOOLEAN;
typedef unsigned char UINT8;
typedef char CHAR8;
typedef signed char INT8;
指针与整型数组
先看一段代码:
int main() {
int *p;
int num[2] = {1, 3};
p=&num[0];
printf("%d\n", *p);
return 0;
}
通过之前的阐述,很好理解,*p=1,另外赋值也不能写成p=&1,当p=&num[0]的时候,这个指针其实就已经和数组关联起来了,计算一下下面几个值等于多少;
p=&num[0];
*p+1=
*(p+1)=
p[0]=
第一个,*p+1什么意思,就是*p和1相加,*p=1,理所当然,*p+1=2;*(p+1)呢,其实是p这个地址加1,假如p=1024,那么p+1=1025吗?错,p+1=1028,因为int占用4个字节,加1是加一个单位,在原地址的基础上需要加4,正好,整型数组元素1的地址规定了是1024,那元素3的地址是多少呢?1028,显然,*(p+1)=3,最后一个p[0]呢,*p=p[0];*(p+1)=p[1];所以,p[0]=1,理解了这些,接下来就可以进行深入理解指针与字符数组了。
指针与字符数组
#include <stdio.h>
int main() {
char name[] = "hello anthony";
char *old = "how old are you";
char number[15];
printf("%c\n", name[1]);
printf("%c\n", old[0]);
return 0;
}
同样的,如上的代码,定义两种不同表达的字符串,第一个字符数组,第二个,字符指针,初始赋值把一个字符串赋给了这个指针,按照之前说明的,很容易能知道输出的值是什么,分别是e和h,那为什么其中还定义了一个字符数组number,但是没用呢,其实我们还可以定义一个指针比如:char *p=number;然后把"how old are you"放进去,当然也可以直接使用number这个字符数组,这几种情况在平时用就差不多了。