栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言入门5:指针入门

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言入门5:指针入门

C语言入门5:指针入门
  • 1、指针是什么?
  • 2、指针怎么用?
    • 2.1 定义指针
    • 2.2 解引用
  • 3、指针与函数
    • 3.1 值传递
    • 3.2 指针/地址传递
  • 4、试一试
    • (1)形参与实参同名情况
    • (2)指针变量连续定义
    • (3)从终端输入地址
    • (4)体会变量传参和地址传参的区别
    • (5)同时获得除数和余数

1、指针是什么?

指针是一种保存变量地址的变量。
在计算机中每个存储单元(一个字节)都有一个编号,这个编号称为变量地址。
普通变量的值是实际值,指针变量的值是变量的地址。

取地址
我们可以在变量名前加上&,表示获取变量的地址。

int n = 10;
printf("&n=%pn",&n);
printf("n=%dn",n);

变量地址通常使用16进制表示,使用%p或者%P打印地址。

2、指针怎么用? 2.1 定义指针

定义指针与定义变量的方式一样,只不过要在类型和变量名中间加上一个*星号。

类型* 指针变量;

指针变量只能使用同类型变量的地址赋值。

int n = 10;
int* p;
p = &n;
printf("&n=%pn",p);
printf("n=%dn",n);

也可以直接初始化。

int n = 10;
int* p = &n;
printf("&n=%pn",p);
printf("n=%dn",n);
2.2 解引用

指针的强大之处可以直接操作储存地址里面的数据。这种操作称为解引用。使用时需要在指针前加上星号。
**注意:这里的
与声明指针的含义不一样,与乘号也不一样。**

int n = 10;
int* p = &n;
printf("n=%dn",n);
printf("*p=%dn",*p);
n = 100;
printf("n=%dn",n);
printf("*p=%dn",*p);
*p = 1000;
printf("n=%dn",n);
printf("*p=%dn",*p);

在这里对p操作就是对n操作;对n操作就是对p操作。

3、指针与函数 3.1 值传递
int func(int m){
    m = 100;
}

int main(){
   int n = 10;
   func(n);
   printf("n = %dn",n);
}

结果为:n=10

3.2 指针/地址传递
int func(int* p){
    *p = 100;
}

int main(){
   int n = 10;
   func(&n);
   printf("n = %dn",n);
}

结果为:n=100

函数内部改变函数外部定义的局部变量必须满足两个条件:

指针参数
解引用
4、试一试 (1)形参与实参同名情况
int func(int n){
    n = 100;
}

int main(){
   int n = 10;
   func(n);
   printf("n = %dn",n);
}

输出结果为: n=10

(2)指针变量连续定义
int m,n;
m = 10;
n = 20;
int* p,q;
p = &m;
q = &n;
printf("%d %dn",*p,*q);

编译出错,指针不可以连续定义。

(3)从终端输入地址
#include 

int main(){
    int m=0;
    int n=0;
    printf("&m=%pn",&m);
    printf("&n=%pn",&n);

    int* p;
    scanf("%p",&p);
    scanf("%d",p);

    printf("m=%dn",m);
    printf("n=%dn",n);

}

首先打印出m,n的地址,然后选择一个地址对指针p进行赋值,然后输入数值,就会对此地址对应的变量值做出改变

(4)体会变量传参和地址传参的区别
#include 

void  func1(int m){ //变量名传参,不能改变变量的数值
  printf("m=%dn",m);
  m = 100;
  printf("m=%dn",m);
}

void func2(int* p){ //传地址,可以改变变量的数值
   *p = 200;
}


int swap1(int a,int b){  //swap交换数值,但是普通传参不能交换

    printf("a=%d,b=%dn",a,b);
    int t =a;
    a =b;
    b=t;
    printf("a=%d,b=%dn",a,b);
}

void swap2(int* p,int* q){ //传变量的地址,用指针接受,就可以改变变量的数值
    int t =*p;
    *p =*q;
    *q =t;

}


int main(){
   int n = 10;
   printf("n:%dn",n);//打印初始值
   func1(n);  //看变量名传参是否可以改变变量的数值


   printf("n:%dn",n);
   func2(&n); //看地址传参是否可以改变变量的数值
   printf("n:%dn",n);

   int x = 100,y=200;
   printf("x=%d,y=%dn",x,y);//打印初始值
   swap1(x,y);//看变量名传参是否可以改变变量的数值
   printf("x=%d,y=%dn",x,y);
   swap2(&x,&y);//看地址传参是否可以改变变量的数值
   printf("x=%d,y=%dn",x,y);
}
(5)同时获得除数和余数
#include 
int divmod(int a,int b,int* mod){
    *mod =a%b;
    return a/b;
}

int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    int mod;
    int div = divmod(m,n,&mod);
    printf("%d/%d=%dn",m,n,div);
    printf("%d%%%d=%dn",m,n,mod);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353189.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号