欢迎光临散文网 会员登陆 & 注册

P3.指针入门

2023-08-25 11:27 作者:创世十鹰  | 我要投稿

基本介绍:

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

举例说明:

指针应用案例:

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 = &num;


//如果要输出一个变量的地址,使用格式%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=&num; 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 = &num;

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();

}

P3.指针入门的评论 (共 条)

分享到微博请遵守国家法律