15-指针

sizeof

  • 是一个运算符,给出某个类型或者变量在内存中所占的字节数。
  • sizeof(iint)
  • sizeof(i)
  • printf(“%ld”,sizeof());

运算符&

  • scanf(“%d”,&i);里的&;
  • 获得变量的地址,它的操作必须是变量
  • int i;printf(“%x”,&i);
  • 地址的大小是否与int相同取决于编译器
  • int i ;peintf(“%p”,&i);
  • &不能对没有地址的东西取地址
    eg:&(a+b)、&(a++)、&(++a)、&(a+6)
  • 相邻的变量的地址,相差4个字节,且自上向下分配
  • 数组的地址
    a[10]
    &a ==a== &a[0]
    &a[0]与&a[1]相差4

指针

  • 指针是保存地址的变量
    int* p,q;
    in *p,q;
    这两种写法都表示:p是指针,q 是普通变量
  • 普通变量的值是实际的值
    指针变量的值是具有实际值的变量的地址

作为参数的指针

  • void f(int *p);
  • 在被调用的时候得到了某个变量的地址;
  • int i = 0; f(&i);
  • 在函数里面可以通过这个指针访问外面这个i(通过传入的地址,从而访问地址中的值,如果在函数里改变了这个地址里的值,则外面函数的值被改变

访问那个地址的变量*

  • *是一个单目运算符,用来访问指针的值所表示的地址上的变量
  • 可以做右值,也可以做左值
    int k = *p; //将p指向的值赋给k
    *p = k+1; //将p指向k+1

指针与数组

  • 函数参数表中的数组实际上是指针
    sizeof(a) == sizeof(int*)
    但是可以用数组的运算符[ ]进行运算
  • 以下四种函数原型是等价的:
    int sum (int *ar, int n );
    int sum (int * , int );
    int sum (int ar[ ] , int n );
    int sum (int [ ] , int );
  • 数组变量是特殊的指针
    1.数组变量本身表达地址,所以

int a[10]; int *p = a; //无需用&取地址

2.但是数组的单元表达的是变量,需要用&取地址

a == &a[0];

3.*运算符可以对指针做,也可以对数组做

*a = *p = a[0]; //此处a是数组,p是指针
*a = 25 ;

4.[ ]运算符可以对数组做,也可以对指针做

p[0] == a[0]

5.数组变量可以看作是const的指针,所以不能被赋值
int b[ ] = a; //这种写法是错误的
int *q = a; //这种写法是正确的
//此处a是数组
int b[ ] = int *const b , b是一个常量,不能被改变,也就不能被赋值。也可以这样理解,b已经被定义在本地变量,他的地址已经固定,它被看作指针是指向自己本身的地址,自己本身的地址不能被其他的地址所代替,自然不能指向其他地址;

而第二个式子,此时a 代表数组a 的首地址,将指针q 指向a的首地址,与其相似的*q = *a,的意思是将数组a首地址的值赋给q所指向的地址

数组与指针的区别

下面用一个例子感受两者区别

定义数组:int a[10]; —>按理可看作 int *const a;
定义指针 : int *const p = a —>将指针p 指向a
定义二重指针: int *pa = &a ; int *pp = &p;

  1. 输出数组a 和指针p的地址:
    a = %p , p = %p , a , p
    结果: a = 65FDF0 b = 65FDF0
    //二者都表示a的首地址
  2. 输出数组pa 和指针pp的地址:
    pa = %p , pp = %p , pa , pp
    结果: a = 65FDF0 b = 65FDF8
    //前者指向a,表a的地址;后者指向p,表p的地址
  3. 输出数组pa 和指针pp所指的值:
    *pa = %d , pp = %d , *pa , *pp
    结果
    pa = 43 *pp = 65FDF0
    //前者指向a地址,并访问a地址中的值也就是a;
    后者指向p地址,解引用就是访问p地址存放的值,也就是a的地址
  4. 输出*a 和 *p所指的值:
    *a = %d , *p = %d,*a,*p
    结果:*a = 43 , *p = 43
    前者是直接访问本地的值,而后者是先访问p中存放的a的地址,才得到a的值
  5. sizeof(a) == 20 , sizeof(p ) ==8
    可以看出数组与指针所占的内存大小也不同,原因是数组a自定义所有单元都被分配了空间,而p被分配一个地址的空间

数组变量可以被看作是const的指针
const 指针变量虽然无法被改变,但可以被赋予变量的地址,同时还可以改变指向的变量的值
eg:
int a[3] = {1,2,3};
int *const b = a;
*b = 2;
printf(“a[0] = %d”,a[0]); //结果:a[0] = 2
以上写法是正确的,但是int c[3] = a,此写法是错误的,这是数组与指针不一样的地方.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值