指针基础
指针是C语言的重点内容之一。
在计算机中,存放运算数据是内存条。内存条内部划分为数个小空间,每个小空间的大小为1字节,且每个空间都有一个16进制的地址。
十六进制:一种逢16进1的计数制,用1、2、3、4、5、6、7、8、9、a、b、c、d、e、f(末尾六个字母分别代表10-15)表示。
指针所表示的对象为内存的地址。指针变量存储变量的地址。
通常而言,一个变量是占据多个空间的。如int变量占据4个字节,因此它会占用4个地址。这4个地址在内存中是连续的4个数字。
对于指针变量来说,知道了数据类型和第一个地址,就能推算出其它地址,因此指针变量通常只会存储变量的第一个地址。
创建:指针变量的创建方式与普通变量的创建类似,需要用到“*”解引用操作符以及“&”取地址操作符。
指针变量表示的是变量的地址,其数据类型前缀需要与原变量相一致。
在不使用指针变量存储地址时,使用取地址操作符也能起到临时调用的效果,例如:
int main()
{
int a = 7; //创建整型变量a的指针变量pa
printf("%p",&a);/*%p为地址占位符,
而"&"表示取出变量a的地址。结果输出a的地址*/
return 0;
}
如果是创建,则需要使用到解引用操作符。
创建格式如下:
int main()
{
int a = 5;
int * pa = &a;
printf("%p",pa);//输出a的地址
return 0;
}
对于其它类型的变量同理。以下为其它指针变量的创建,省略对初始变量的定义:
char * pa = &a;
double * pb = &b;
float * pc = &c;
基础运用:
在运算中,程序可以通过指针变量导向的地址获取变量的值。
int main()
{
int a = 5;
int * pa = &a;
printf("%d",*pa); //“*”表示获取pa地址所指向的变量
return 0;
}
程序也可以通过指针变量导向的地址改变变量的值。
int main()
{
int a = 5;
int * pa = &a;
*pa = 20; //通过地址改变变量a的值
printf("%d",a); //输出20
return 0;
}
结构体基础
结构体是由一批数据组合而成的结构型数据。
结构体需要在函数外进行声明并定义其形式。这需要用到struct指令。
结构体中的变量称为结构成员。
struct a //在函数外创建一个结构体形式,命名为a
{
int number; /*该结构体中包含三个变量数据,即结构成员*/
char name[20];//汉字所占的长度较大
double score;
};
上述代码可以理解为,在函数中使用结构体之前,先声明一种结构体类型,给出结构体内的结构成员,指导程序在之后的创建中如何去使用。上述结构体形式a在函数中可以有多个,只需要这些结构体变量之间的名字不同即可。
在函数中初始化结构体:
int main()
{
struct a b;//创建一个a类型的结构体b
b = {8,"张三",78.5};//根据a结构体内变量的排序一一赋值
return 0;
}
对结构体进行操作一般需要用到结构体成员操作符。
int main()
{
struct a n ={8,"张三",78.5};
printf("%d,%s,%lf",n.number,n.name,n.score);
/*打印的结果为8,张三,78.5*/
return 0;
}
在上述代码中,操作符"."为结构成员操作符之一,可以从特定结构体中取出指定的变量。
使用指针变量也能实现上述效果。
int main()
{
struct a n ={8,"张三",78.5};
struct a * pa = &n;
printf("1:%d,%s,%lf\n",(*pa).number,(*pa).name,(*pa).score);
printf("2:%d,%s,%lf\n",pa->number,pa->name,pa->score);
//上述两种输出方式是等效的,只是使用了不同的操作符而已
return 0;
}
至此,C语言基础知识概念已大致了解,将进入到下一阶段的学习。