标签:soc 修改 过程 识别 函数 col struct core 开关
指针
指针概念的引入
程序有数据和指令组成,数据和指令在执行过程中存放在内存中。变量是程序数据中的一种,因此变量也存储在内存中;内存中的每个字节都有一个唯一的编码,即内存地址。32位机的内存地址编码是32位的(所以32的内存最多4G),64位机的内存地址编码是64位的。地址是一个无符号的整数,从0开始递增,通常把地址写成十六进制数。地址的长度跟主机的字长相同。
直接到变量名标识的存储单元中读取变量的值。最常见的就是scanf函数,scanf("%d",&a),这里的&表示取地址,是将获取到的值存储到a这个地址里面。如果我们这里不写&取地址运算符,获取的就是a的地址(?为什么直接写a,获取的是a的地址,&a是取a地址,这个不是相互矛盾吗?)
通过其他变量间接的找到变量的地址,最常用的就是指针。指针类型就是指向变量的地址。
int *pa; // 定义语句 表示pa保存的是一个int数据类型的地址(不要理解成地址是一个int类型的,表明首地址,并说明数据类型(推断出长度))
int *pa = &a; // 初始化,也可以写成int a = 1;pa = &a;因为*pa是一个地址,而&a是取地址。所以两者是可以赋值的。
我们可以吧指针理解为一个软连接的概念。
# include <stdio.h>
int main(){
int a=0,b=1;
int *pa,*pb;
pa = &a;
pb = &b;
printf("a = %d,b=%d\n",a,b);
printf("*pa=%d,*pb=%d\n",*pa,*pb);
return 0;
}
指针的定义
定义指针
int *a=NULL; // 这里的int表示指针指向的地址是要存放int类型的数据。这里的*表示指针的解引用,a实际是指针指向的地址,而*a表示a指向的内存地址所代表的值;指针必须被初始化,没有初始化的指针是无法使用的。为了防止意外的发生,通常高我们会将指针命名为null。
指针与变量的区别
int a = 0; // 这里的a只是我们标识某个内存空间的值,是方便我们识别用的。计算机会将a这个标识符映射为逻辑地址,再转换成物理地址,最后输出值的。而*p则是直接访问p所存储的地址的值
int a = 0;
int *p = null;
p = &a;
printf("%d",*p);
解释: a表示0这个变量的长度和首地址,&a表示首地址;*p表示首地址和长度,p表示这个int类型的地址存什么值,&p是*p的地址。可以将a理解为抽屉A,p理解为抽屉B,通过指针访问就是抽屉B中放着抽屉A的钥匙.
int a = 10;实际上a也是地址值,只是通过这个地址值能直接访问到该值。而p=&a 就是将a的地址值给p,当我们方位地址p中的地址是,就能通过地址获地址代表的值。
指针的用处
指针存在的意义就是为了间接引用
#include <stdio.h>
main(){
// int *p = 10; // *p 接收的只能是地址
int a = 10;
// int *p = a; // 这句话是错误的。
int *p = &a;
printf("p is %d\n",p);
printf("*p is %d\n",*p);
printf("&p is %d\n",&p);
}
必备代码:如何使用指针交换连个值。
#include <stdio.h>
void swap(int *a,int *b);
/*
* 使用指针交换用户输入的两个数据
*/
void main() {
int a,b;
printf("Please type two number value of a,b:\n");
scanf("%d,%d",&a,&b);
printf("before swap,the value of a is %d,the value of b is %d.\n",a,b);
swap(&a,&b);
printf("after swap,the value of a is %d,the value of b is %d.\n",a,b);
}
/*
* 始终不是很明白为什么这里使用int middle 来接收指针*/
void swap(int *a,int *b) {
int middle ;
middle = *a;
printf("%d",*middle);
*a = *b;
*b = middle;
}
struct 结构体名称{
数据类型 成员变量名称;
……
};
#include <stdio.h>
struct student{
int age;
int class;
int score[3];
};
void main(){
// 初始化并赋值方式之一:
struct student stu1;
stu1.age=10;
stu1.class=1;
// stu1.socre[] = {11,22,33}; // 这种赋值错误的,反正我也不知道为什么
stu1.score[0]=11;
stu1.score[1]=22;
stu1.score[2]=33;
// 初始化并赋值方式之二
/* struct student stu2;
stu2 = {10,1,{11,22,33}}; // 这种赋值方式是错误的 */
struct student stu2 ={10,1,{11,22,33}};
printf("This is content of student struct:\n");
printf("student age is : %d\n",stu1.age);
for(int i=0;i<3;i++){
printf("student‘s score:%d\n",stu1.score[i]);
}
}
#include <stdio.h>
void main(){
/*
* 定义一个结构体
* 使用typedef 关键字,将student的别名设置为了STUDENT
* 这样的话在声明结构体时就可以省掉一个struct关键字*/
typedef struct student{
int age=10;
char name[10];
}STUDENT;
// 声明一个结构体
STUDENT st1={1,{‘h‘,‘u‘,‘a‘,‘b‘,‘i‘,‘n‘}};
}
stu1.socre[] = {11,22,33};
struct student stu2;
stu2 = {10,1,{11,22,33}};
标签:soc 修改 过程 识别 函数 col struct core 开关
原文地址:https://www.cnblogs.com/yanghuabin/p/9761085.html