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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹志鹏 中级黑马   /  2014-12-11 09:28  /  743 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、指针1、指针的定义
(1) C语言中,定义一个普通的变量(如整型数),我们这样做:int i; 而定义一个指针变量(指针)我们需要这样做:
              格式:变量类型 *变量名       例如:int *p ;
(2)指针变量只能存储地址,则  
【例1】 int *p;
          int a = 10;
          p = a;  //这是错误写法
          p = &a; //这样才是正确的
  在【例1】中,p = &a表示指针变量p中存放着整型数据10的内存地址;*p表示访问p指向的内存地址。因此我们可以通过指针实现通过函数修改外部变量的值:【例2】
#include <stdio.h>
void change(int *n);
int main()
{
     int a = 20;
     change(&a);
     printf("%d\n",a);
     return 0;
}
void change(int *n)
{
     *n = 10;
}
【例2】输出结果为:10,实现我们之前使用简单函数传值无法完成的功能。(3)关于指针定义的注意点:
  定义指针变量时,也有多种数据类型,比如:int,char,long....,那么不同类型的指针变量有什么作用哦呢?所占的内存大小有什么不同呢?

【例3】
#include <stdio.h>
int main()
{
    int a;  //一个字节
    char c; //四个字节
    long b; //八个字节

    int *ap;
    char *cp;
    long *bp;
    printf("ap=%zd,cp=%zd,bp=%zd\n",sizeof(ap),sizeof(cp),sizeof(bp));
    return 0;
}
输出结果:ap=8,cp=8,bp=8

【例3】结果我们可知:无论定义的指针变量是什么类型,它所占的内存都是8个字节,那么我们为什么还要在定义指针的时候区分类型呢?

【例4】
#include <stdio.h>
int main()
{
     char c = 1;
     int  *p;
     p = &c;
     printf("c的值是%d\n",*p);
     return 0;
}
打印结果:c的值是513

【例4】输出的结果显然不是我们希望的,为什么会出现错误结果呢,原因就是我们把一个int类型的指针指向了一个char类型的内存,具体原因涉及到内存分析,这里不作深入分析。只需要得到结论----定义指针时候的类型可以限定在赋值和取值的时候所访问的内存字节大小,所以我们使用指针时一定要注意保证类型匹配。
2、指向指针的指针

指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们可以将指针的地址存放在另一个指针中,如:


【例5】
int a = 10;
int *p = &a;
int **p = &p;

【例5】在内存中的关系可以表示如下:



由上图可知:

*p  = a;

(*pp) = p;

*(*pp) = *p = a;

**pp = *p = a;

所以,我们由两种方式修改整型a的值:

1)a = 20;  **pp = 20;


3、指针与数组

在C语言中,指针与数组的关系密不可分且应用广泛,例如使用指针遍历数组:

【例6】
#include <stdio.h>
int main()
{
   int ages[5] = {10,20,30,40,50};
   int *p;
   //指针p指向数组的首元素
   p = &ages[0];
   //数组名也就是数组的首地址,也就是数组的地址,所以  p = ages;也是一样

   //开始使用指针遍历数组
    for(int i = 0;i<5;i++)
   {
     printf("ages[%d]=%d\n",i,*(p+i));
   }
}
打印结果:ages[0]=10
        ages[1]=20
               ages[2]=30
               ages[3]=40
               ages[4]=50
【例6】在内存的关系可以用下图表示:



4、指针字符串和字符串数组
1、指针字符串
(1)字符串变量的定义:

char name[] = "it"; 这种定义方法产生的字符串变量值是可以改变的,如
name[0] = 'T';  //这种写法是正确的

还有另外一种方法,使用指针定义:

char *name[] = "it"; 表示指针变量name指向字符串的首字符,并且变量值是不可修改的,如
name[0] = 'T';  //这是非法的,会出现内存错误

(2)两种定义方式的比较:
特点:1)利用数组定义字符串,存储在内存中的缓存区(栈),里面的字符是可以修改的;
            2)利用指针定义的字符串,存储在内存中的常量区,里面的字符是不可修改的
使用场合:1)利用数组定义字符串,字符串的内容经常需要修改的;
               2)利用指针定义的字符串,字符串的内容不需要修改,而且经常被使用。

2、指针字符串数组

(1)由前面的指针字符串的定义可知,字符串数组的定义方式也有两种:

        1)二维字符串数组:

        char names[2][10] = {"hello","ok"};
        2)指针数组:
        char *name[3] = {"hello","ok","true"};
     (2)字符串的输入:
        int main()
        {
        char name[20];
        printf("请输入姓名");
        scanf("%s",name);
        return 0;
        }





3 个回复

倒序浏览
不错的笔记,不过还是建议按照要求发布哦!
回复 使用道具 举报
邓明 发表于 2014-12-11 13:27
不错的笔记,不过还是建议按照要求发布哦!

你说的按照要求发布是说博客么?
回复 使用道具 举报
邹志鹏 发表于 2014-12-11 13:48
你说的按照要求发布是说博客么?

是的。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马