C语言--指针

#include<stdio.h>
int main()
{
int *p; //p是变量的名字,int *表示p变量存放的是int类型变量的地址, p=i是错误书写
int i=3;  //int *不表明定义了一个名字叫做*p的变量
          //int *p应理解为:p是变量名,p变量的数据类型是int*类型,所谓int *类型就是存放int变量 
          地址的类型
p=&i;    //p保存了i的地址,因此p指向i 。  p不是i,i也不是p,修改p的值不影响i的值,修改i的值也不影 
          响p的值

return 0; 
}

如果一个指针变量指向了某个普通变量,则*指针变量就完全等同于普通变量

例子:如果p是个指针变量,并且p存放了普通变量i的地址,则p指向了普通变量i

        * p 就完全等同于i或者说在所有出现*p的地方都可以替换成i

        在所有出现i的地方都可以替换成*p

     *p就是以p的内容为地址的变量

指针就是地址,地址就是指针

地址就是内存单元的编号,指针变量是存放地址的变量   

指针和指针变量是两个不同的概念

但是要注意:通常我们叙述时,会把指针变量简称为指针,实际他们含义并不一样

指针的重要性:

1.表示一些复杂的数据结构

2.快速的传递数据

3.使函数返回一个以上的值

4.能直接访问硬件

5.能够方便的处理字符串

6.是理解面向对象语言中引用的基础

指针的定义:

   地址:内存单元的编号 从零开始的非负整数

     

   

指针的分类:

1.基本类型指针

    

#include<stdio.h>
int main()
{
int *p;
int i=3;
int j;
p=&i;

}

#include<stdio.h>

int main()

{

  int i=5;

  int *p;

  int *q;       

 p=&i;

 *q=p;   //error语法编译会出错

*q=*p;//error 

p=q;  //error q是垃圾值,q赋给p,p也变成垃圾值

printf("%d\n",*q);

return 0;

}

不能完成互换功能:

#include<stdio.h>
void huhuan(int a,int b)
{
 int t;
 t=a;
 b=t;
 a=b;
return;    //终止函数,互换形参结束,这个a,b的地址也结束,释放内存空间
}



int main()
{

int a=3;
int b=5;

huhuan(a,b);
printf("a=%d,b=%d\n",a,b);    //互换失败
return 0;
}

void huhuan_2(int *p,int *q)

{

int t;   //如果互换*p和*q的值,t必须定义成int,不能定义成int*,否则语法出错

t=*p;    //p是int *,   *p是int。*p代表的是以p的内容为地址的变量

*p=*q;

*q=t;

}               

int main()

{

int a=3;

int b=5;

huhuan_2(&p,&q);

printf("a=%d,b=%d\n",a,b);

return 0;

}

*号的含义:

    乘法

   定义指针变量:int *p

   指针运算符:该运算符放在已经定义好的指针变量的前面

                        如果p是一个已经定义好的指针变量,则*p表示指向地址的内容

指针使函数返回一个以上的值

如何通过被调函数修改为主调函数普通变量的值

1.实参必须为该普通变量的地址

2.形参必须为指针变量

3.在被调函数中通过* 形参名 的方式就可以修改主调函数相关变量的值

#include<stdio.h>

 void f(int *p,int *q)
{

 int t;
t=*q;
*q=*p;
*p=t;

}


int main()
{
 f(&a,&b);
printf("%d %d\n",p,q);
return 0;
}

2.指针和数组的关

(1)  指针和一维数组

           一维数组名:是一个指针常量,它存放的是一维数组第一个元素的地址

            

                

int a[3][4];//3行4列  a[0][0]是第一个元素

     下标和指针的关系

           指针+-整数:

                   指针类型决定了指针走一步,指针走多远(指针的步长)

                  int*p;--->4字节

                 char*p;--->1字节

                 double*p;--->8字节

                       

              

                  如果p是个指针变量,则p[i]永远等价于*(p+i)

                 如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息

                需要两个参数: 1.数组第一个元素的地址       2.  数组的长度

  

#include<stdio.h>

void f(int* pArr,int len)  //len=length数组的长度
{
int i;
for(i=0;i<len;++i)
printf("%d ",*(pArr+i));   //*pArr   *(pArr+1) 分别为第一个元素地址,第二个元素地址
printf("\n");


}


int main()
{
int a[5]={1,2,3,4,5};
int b[6]={-1,-2,-3,4,5,-6};
int c[100]={1,99,22,-33};
f(a,5);

return 0;
}

            指针变量运算

     

     

(2)指针和二维数组

 

3.指针和函数

4.指针和结构体

5.多级指针

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值