P3.指针入门
基本介绍:
本身指针需要放在后面讲解,但是授课很快就会使用到指针的概念,因此先对 指针做一个入门讲解(后面还会详细讲解的),简单的说 指针表示一个地址,
举例说明:

指针应用案例:
1) 写一个程序,获取一个int变量num的地址,并显示到终端
2) 将num的地址赋给指针 ptr , 并通过ptr去修改num的值.
3) 并画出案例的内存布局图
课堂练习(判断程序是否正确) :
void main() {
int a = 300;
int *ptr = a;
}
题1 (错误: 把 int 赋给 int *)

void main() {
int a = 300;
float *ptr = &a;
}
题2(错误:把 int 的地址赋给 float *)

void main() {
int a = 300; // a = 300
int b = 400; // b = 400
int * ptr = &a; // ptr 指向 a
*ptr = 100; // a = 100
ptr = &b; // ptr 指向 b
*ptr = 200; // b = 200
printf("\n a=%d,b=%d,*ptr=%d", a, b, *ptr);
getchar();
}
//输出什么内容? a = 100, b = 200, *ptr = 200

指针细节说明:
1) 基本类型,都有对应的指针类型, 形式为 数据类型 *,比如 int的对应的指针就 是 int *, float 对应的指针类型就是 float * , 依次类推。
2) 此外还有指向数组的指针、指向结构体的指针,指向共用体的指针,后面我们 再讲到数组、结构体和共用体时,还会详细讲解。

我的源码及注释:
#include <stdio.h>
void main(){
int num = 33;
//定义一个指针变量(指针就是地址)
//名称ptr,ptr是一个 int* 类型
//ptr指向了一个int类型的变量的地址(也就是说ptr指向了num变量的地址)
//也就是说,ptr保存了int类型的变量num的地址
int *ptr = #
//如果要输出一个变量的地址,使用格式%p
// &num 表示取出num这个变量对应的地址
printf("num的值=%d num的地址是%p\n",num,&num);//输出 num的值=33 num的地址是012FF754
//指针变量,本身的地址是 &ptr
//指针变量中,存放的地址 ptr (ptr里面存放的就是地址)
//指针变量,指向的值 *ptr(ptr里面存放地址所指向的值)
printf("ptr指向的值是%d ptr的值=%p ptr的地址是%p\n",*ptr,ptr,&ptr);//输出 ptr指向的值是33 ptr的值=012FF754 ptr的地址是012FF748
//控制台停留,等待输入
getchar();
}


值传递和地址传递:
C语言传递参数(或者赋值)可以是值传递(pass by value),也可以传递 指针(a pointer passed by value), 传递指针也叫地址传递。
1) 默认传递值的类型:基本数据类型 (整型类型、小数类型,字符类型), 结构体, 共用体。
2) 默认传递地址的类似:指针、数组。
值传递和地址传递使用特点:
1) 值传递:将变量指向的存储内容,在传递/赋值时,拷贝一份给接收变量。

2) 地址传递 也叫 指针传递:如果是指针,就将指针变量存储的地址,传递给 接收变量,如果是数组,就将数组的首地址传递给接收变量。


我的源码及注释:
/*
C语言传递参数(或赋值),可以是值传递(pass by value),也可以是传递指针(a pointer passed by value),传递指针也叫地址传递。
1.默认是传递值的类型有:基本数据类型(整形类型(int)、小数类型、字符类型),结构体,共用体。
2.默认传递地址的有:指针、数组。
值传递:将变量指向的存储内容,在传递或赋值时,拷贝一份给接收变量。
所以当修改拷贝后的值后,不会影响原来变量num的值 (int num = 3; int num2 = num; num2=666; 修改num2的值不会影响num)
地址传递 也叫指针传递:如果是指针,就是将指针变量存储的地址,传递给接收变量。
如果是数组,就是将数组的【首地址】传递给接收变量
int num=100; int * p=# int *p2=p; *p2=666;
执行说明:在内存为num变量开辟一块空间,为p指针开辟一块空间(空间中存放num的地址),
为p2指针开辟空间(里面存放p的值(也是存放num的地址)),通过*p2修改为666,p2存放的地址是num的地址,所以*p2修改的是num的值
*/
#include <stdio.h>
void main(){
int num = 33;
int * p = #
int * p2 = p;
printf("num的值是%d num的地址是%p\n",num,&num);
printf("p指针指向的值是%d p指针的值(存放的值(地址))是%p p指针本身的地址是%p\n",*p,p,&p);
printf("p指针指向的值是%d p2指针的值(存放的值(地址))是%p p2指针本身的地址是%p\n\n",*p2,p2,&p2);
*p2 = 666;
printf("num的值是%d num的地址是%p\n",num,&num);
printf("p指针指向的值是%d p指针的值(存放的值(地址))是%p p指针本身的地址是%p\n",*p,p,&p);
printf("p指针指向的值是%d p2指针的值(存放的值(地址))是%p p2指针本身的地址是%p\n",*p2,p2,&p2);
getchar();
}
/*
输出:
num的值是33 num的地址是0097FAEC
p指针指向的值是33 p指针的值(存放的值(地址))是0097FAEC p指针本身的地址是0097FAE0
p指针指向的值是33 p2指针的值(存放的值(地址))是0097FAEC p2指针本身的地址是0097FAD4
num的值是666 num的地址是0097FAEC
p指针指向的值是666 p指针的值(存放的值(地址))是0097FAEC p指针本身的地址是0097FAE0
p指针指向的值是666 p2指针的值(存放的值(地址))是0097FAEC p2指针本身的地址是0097FAD4
*/


课后练习题:
1) 试编写程序实现如下效果
姓名 年龄 成绩 性别 爱好
xx xx xx xx xx
要求: a、用变量将姓名、年龄、成绩、性别、爱好存储
b、添加适当的注释
c、添加转义字符
2) 编写如下代码,并看打印效果
void main() {
int number1;
int number2;
int number3;
int number4 = 50;
int number5;
number1 = 10;
number2 = 20;
number3 = number1 + number2; //30
printf("\nNumber3 = %d" , number3);// 30
number5 = number4 - number3;//20
printf("\nNumber5 = %d" , number5);//20
getchar();
}

课后练习题:
3) 实现两个整数的加减乘除以及取余算法 定义两个变量,分别保存键盘输入的两个整数【键盘输入可选,如果不用输入,可以直接用变量保存】 示例效果如下:
请输入第一个整数:10
请输入第二个整数:5
*************************************
小小计算器
*************************************
10 + 5 =15
10 - 5 = 5
10 * 5 = 50
10 / 5 = 2
提示:用scanf语句获取控制台的输入

4) 判断一个整数是偶数还是奇数 , if

提示:if(判断条件)
5) 总结学过的命令: 输入、输出、运算、存储 [自己做]

我的源码及注释:
第1题:
#include <stdio.h>
void main(){
//使用字符数组代表字符串
char name[] = "张三";
short age = 18;
double score = 69;
char gender[] = "男";
char love[] = "篮球,music,涩涩";
printf("姓名\t年龄\t成绩\t性别\t爱好\n%s\t%d\t%.2f\t%s\t%s\n",name,age,score,gender,love);
getchar();
}

3.
#include <stdio.h>
void main(){
int num1 = 0;//一般习惯赋初始值
int num2 = 0;
//键盘输入
printf("请输入num1的值: ");
scanf("%d",&num1);
printf("请输入num2的值: ");
scanf("%d",&num2);
//加法
printf("%d + %d = %d", num1, num2, num1+num2);
//乘除法
printf("\n%d * %d = %d", num1, num2, num1*num2);//"\n"表示换行
printf("\n%d / %d = %d", num1, num2, num1/num2);
getchar();//过滤回车键
getchar();//暂停控制台,等待输入
}
4.
#include <stdio.h>
void main(){
int num = 10;
if(num % 2 == 0){
printf("%d 是偶数", num);
}else{
printf("%d 是奇数", num);
}
getchar();
}