首页 > 其他分享 >初识C语言(指针、结构体)

初识C语言(指针、结构体)

时间:2024-12-09 18:30:44浏览次数:5  
标签:ps 变量 int C语言 地址 初识 printf 指针

*前言

学习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

相关文章

  • 洛谷 P5587 打字练习 C语言
    题目:https://www.luogu.com.cn/problem/P5587题目描述R君在练习打字。有这样一个打字练习网站,给定一个范文和输入框,会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .(英文句号),输入字符后,光标也会跟着移动。输入的文本有多行,R君可以通过换行键来......
  • 洛谷 P8824 [传智杯 #3 初赛] 终端 C语言
    题目:https://www.luogu.com.cn/problem/P8824题目描述有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个Terminal。具体来说,它需要支持如下命令:touchfilename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名文件的话则不进行任何操作。......
  • C语言 汉诺塔
    题目描述汉诺塔Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。......
  • C语言基础-循环结构
    循环结构什么是循环代码的重复执行,就叫做循环循环的分类无限循环(死循环):程序设计中尽量避免无限循环。程序中的无限循环必须是可控的。有限循环:循环限定循环次数或者循环的条件。循环的构成循环条件循环体当型循环的实现特点:先判断、后执行,如果条件不满足,一次都不执......
  • 2.7 指针什么时候表示值什么时候表示地址
    1. 指针表示地址-声明时:当你声明一个指针变量时,这个变量本身存储的是一个地址。例如, int*p; 这里的 p 是一个指针变量,它被用来存储一个 int 类型变量的地址。-作为函数参数传递时:当你把一个指针作为函数参数传递时,你传递的是地址。例如, voidfunc(int*ptr); 这......
  • C语言编程1.22小L的难题
    题目描述最近,小L遇到了一道难题,请你帮帮他。给出n个数,请找出这个序列的任意两个不同的数第二小的差值。ai��和aj��的差值定义为∣ai−aj∣∣��−��∣,即两个数差的绝对值,其中i�和j�互不相同。(第二小即从小到大排序之后的第二个数字)输入格式第一行为一个正整数n(3≤n≤105)�(3≤�≤105),代表数......
  • #C01L07P01. C01.L07.for语句初识.什么是循环
    1.情景导入某校某年级某班某位男生很爱哭,“wa”、“wa”、“wa”声音经常不绝于耳,现在请你通过编程来模拟他的哭声,他每发出一次哭声,则你输出一行——一个“wa”;他哭了2次,我们可以这样写:#include<iostream>usingnamespacestd;intmain(){ cout<<”wa”<<endl; cout<<......
  • 指针--习题
    设计一个指针函数,可以将3×3矩阵转置transposeMatrix函数h它接收一个指向包含3个整数的数组的指针(也就是可以用来表示二维数组的一种指针形式)作为参数,这个参数指向了要进行转置操作的3×3矩阵。通过两层嵌套的for循环,实现了矩阵元素的交换来完成转置操作。内层循环从i+......
  • C语言题目-成绩程序
    题目:给出百分制成绩,要求输出成绩等级'A',"B','℃','D','E'。90分以上为'A',80-89分为'B’,70-79分为'C',60-69分为'D',60分以下为'E'。代码:#include<stdio.h>#include<stdlib.h>int......
  • Mysql到底是个什么玩意?(初识Mysql)
    学编程和数据的小伙伴应该都听说过MySQL,仿佛全世界的编程都离不开mysql,那么mysql到底是什么,为什么大家都在用它。Mysql是什么?它一个流行的开源关系型数据库管理系统(RDBMS),它将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。Mysql被广......