*前言
学习C语言自用
教材:C程序设计第五版--谭浩强
线上课程:跟学博主:鹏哥C语言。视频:1. 【初识C语言】 认识C语言_哔哩哔哩_bilibili
1.指针
1.1内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
为了有效的使用内存,把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(byte)。
为了能够有效的访问到内存的每个单元,给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
举例查看对应存储地址:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 10;
&a;
printf("%p", &a);
return 0;
}
查看输出结果:
1.2指针
指针:地址
* 说明p是指针变量,前面的int说明p指向的对象是int类型。
同类型多个指针需要分别带 * 号。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a = 10;
//&a;
printf("%p", &a);
int* p = &a;//p就是指针变量(地址)
return 0;
}
推广到其他类型:
利用指针的地址更改a的值:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a = 10;
//&a;
//printf("%p", &a);
int* p = &a;//p就是指针变量(地址)
//char ch = 'w';
//char * pc = &ch;
//*p;//解引用操作符:通过p中存放的地址,找到p所指向的对象。
*p = 20;
printf("%d\n", a);
return 0;
}
1.3指针变量的大小
不管什么类型的指针,在创建时指针变量的大小取决于地址存放组要多大的空间。
32位平台(x86)下地址是32个bit位(即指针变量的大小是4个字节)
64位平台(x64)下地址是64个bit位(即指针变量的大小8个字节)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double *));
return 0;
}
运行结果:
指针大小在32位平台是4个字节,64位平台是8个字节。
2.结构体——struct
结构体把单一类型组合在一起使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。这里只能使用结构体来描述了。
举例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu
{
//成员变量
char name[20];
int age;
char sex[10];
char tel[12];
};
int main() {
//录入结构体信息,将信息存入变量s,且规定s是Stu结构体类型的
struct Stu s = { "谭二", 20, "男", "16672011111" };
// . 为结构成员访问操作符,一一对应,逗号隔开
printf("name = %s\nage = %d\nsex = %s\ntel = %s\n", s.name, s.age, s.sex, s.tel);
return 0;
}
运行结果:
使用函数传地址参数:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu
{
//成员变量
char name[20];
int age;
char sex[10];
char tel[12];
};
void A(struct Stu* ps)//A函数里,ps就相当于这个函数的变量,由下文中可知传进来的是s的地址
{
printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tel);
//对A函数找输出,他的变量是ps,且用的是*传参,所以要整体框起来再加.号。
};
int main() {
//录入结构体信息,将信息存入变量s,且规定s是Stu结构体类型的
struct Stu s = { "谭二", 20, "男", "16672011111" };
// . 为结构成员访问操作符,一一对应,逗号隔开
printf("name = %s\nage = %d\nsex = %s\ntel = %s\n", s.name, s.age, s.sex, s.tel);
A(&s);//把s的地址传给A函数
return 0;
}
运行结果;
这样传参过于复杂。为了方便表示,引入->操作符:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu
{
//成员变量
char name[20];
int age;
char sex[10];
char tel[12];
};
void A(struct Stu* ps)//A函数里,ps就相当于这个函数的变量,由下文中可知传进来的是s的地址
{
printf("传参:%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tel);
//对A函数找输出,他的变量是ps,且用的是*传参,所以要整体框起来再加.号。
//->操作符:利用结构体指针变量->成员名,跳过*地址传参的方法,直接指向变量本身
printf("->操作符:%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tel);
};
int main() {
//录入结构体信息,将信息存入变量s,且规定s是Stu结构体类型的
struct Stu s = { "谭二", 20, "男", "16672011111" };
// . 为结构成员访问操作符,一一对应,逗号隔开
//printf("name = %s\nage = %d\nsex = %s\ntel = %s\n", s.name, s.age, s.sex, s.tel);
A(&s);//把s的地址传给A函数
return 0;
}
运行结果:
学习初期有诸多不足之处,欢迎来私信与我一同交流学习,共同进步!
标签:ps,变量,int,C语言,地址,初识,printf,指针 From: https://blog.csdn.net/yuerqiu/article/details/144352215