A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CcrazyOne 中级黑马   /  2015-10-9 00:59  /  845 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3.指针与指针类型

     定义赋值:
     int a=0; int *p1=&a;int **p=&P1;
     操作:
     1.对指针的操作--*对指针本身无意义
     1.向高位移动(+): p+1,p++;
     2.向低位移动(-): p-1,p--;
     2.对指针所指空间的操作
     1.取值: 一级取值:*p;(取的是p1的值),二级取值:**p;(取的是a的值)
     2.赋值: *p=&p1;**p=5;

4.指针与字符串
     定义赋值:
     字符串:char *p="heima";//注意与字符数组定义的区别:指针定义时是常量
     字符串数组:char *ps[3]={"heima","itcast","itheima"};//注意是数组
     操作:
     1.对指针的操作
     1.向高位移动(+): p+1,p++;
     2.向低位移动(-): p-1,p--;
     2.对指针所指空间的操作--跟数组使用基本类似
     1.取值:
     取当前位的值: *p或p[0];
     取下一位的值: *(p+1);或p[1](等效于:p[当前角标+1]);
     取上一位的值: *(p-1);或p[-1](等效于:p[当前角标+1]);
     2.赋值: !!!注意:常量不能赋值.(*这是说指针指向的空间,指针本身是可以赋值的);
     如:char *p="itheima";
     p[0]='m'//错误; 不能对指针所指空间的常量进行改变.
     p="itcast";//正确. 指针本身并不是常量.里面存的地址可以变化.


5.指针与函数
     函数的指针定义:
     类型 (*指针名)(参数类型);
     如:int (*p)(int);
     表示如下函数的指针类型:
     int add(int a){
     return 0;
     }
     赋值:
     指针名=函数名;
     如:p=add;
     操作:
     1.调用函数:
     指针名(实参);
     如:p(5);

*/
#include<stdio.h>
int main(){
    int arr[4]={1,2,3,4};
    /*
        int **p;
        p=&arr;
        printf("类型错误**p---arr[0]=%d\n",**p);
        这种定义是错误的.类型不对应.int ** 与 int (*)[]类型
     */
    printf("1特殊格式**&arr---arr[0]=%d 能打印但无意义\n",**&arr);
    //数组元素的指针
    int *p_single;
    p_single=&arr[2];
    printf("2数组元素指针*p_single--arr[2]=%d\n",*p_single);
    //数组指针
    int (*p_whole)[4];
    p_whole=&arr;
    printf("3数组指针(*p_whole)[2]---arr[2]%d\n",(*p_whole)[2]);

    /*1) 仅知道arr==&arr==&arr[0]是不够的,还需要牢记它所代表的意义.即知道它的数据类型 用什么占位符
      2) arr 是int *类型  &arr是int(*)[] 类型 &arr[]是int *类型
      3) int (*)[4]和 int (*)[5]这是两个类型 就是每个构造体都有自己独有的类型一样

     还是那句话  :值都是地址,但其意义即类型不同.
      (1)可以用数组元素的地址给一级指针赋值,那么这个指针就是数组元素指针;arr和&arr[0]都属于这种
      (2)用数组名给一个指针赋值  那么这个指针就是数组指针,这个指针就必须是 int (*)[] 类型  不能是一级指针的类型.也不是二级指针;
     */
    return 0;
}

2 个回复

倒序浏览
希望可以帮助到大家更好的了解指针
回复 使用道具 举报
不错 mark
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马