码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员学习心得------C语言复杂数据类型之指针

时间:2016-04-11 22:12:06      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

众所周知,指针是C语言中最重要也是最难的一种数据类型,这是C语言中与其他类似于Java等语言不同的直接操纵内存的一种数据。也有人如此形容指针的重要性“如果你C语言中除了指针都学得很好,信手拈来,唯独不会指针,那么你就是没学过C语言!”。下面来回忆一下这段时间学习指针的心得。

1 定义的格式: 指向内容的数据类型  *指针变量名 

例如: int  *p;

2 指针的赋值问题    

int a=10;

int *p=&a;//指针p指向的a的地址值

 int *p;

p=&a  //这两种赋值都可以.

printf("%d",*p);//输出的值为10

3使用指针改变实参的值 ,如下代码,指针直接改变内存,改变后指向的变量值也被改变。

#include <stdio.h>

void change(int *p)
{
    *p=20;//改变指针指向的地址的数据值为20
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int x=10;
    int *p=&x;   //指针p指向x的地址值
    change(p);  //调用change函数
    printf("x的值为%d",x);//输出x的值 x=20 因为指针直接干预内存改变实参的值
    return 0;
}

4.指针定义时的注意点

1>  int *p;   p = 1000; //错误写法

 2>int *p;   *p = 100;// 错误写法 p指向的变量的值赋值为100 但p没有指向任何地点

3> int *p;  *p = &a; //错误写法

4> %p输出指针里面存储的地址值

 5>其他指针类型说明,比如float *p;  char *p;

 6>不能乱用类型,比如int a = 10;  float *p = &a;

5 清空指针的方法

p=0;或者p=NULL;

6指向指针的指针

可能初学者接触指针这个概念会有点混淆,对于指向指针的指针就有点更摸不着头脑了,其实只要理解了指针的含义,在考虑清楚想清楚后可以一点点的推敲出来,实在不行的话可以像老师视频教学中一样画一个内存的分析图,很多问题就可以清晰明了了,指向指针的指针表示定义一个指针指向原有的指针,下面通过一段代码体会一下:

#include <stdio.h>
int main()
{
    int a = 10;
    int *p = &a;
    *p = 20; // *p表示指针变量p访问a的存储空间并将20赋值,相当于*p==a==20
    
    int **pp = &p; // 指向指针变量p的指针
    **pp = 20; // 这句实际就是*pp==p  因此**pp==*p==a也就是把20赋值给a
    return 0;
}

这段代码中*p指向了a的地址值,**pp指向了*p的地址值,相当于  *p=**pp=a。规律:指针中有几个*号就相当于指针指了几次。

7 指针所占的内存空间,无论指针是任何类型的,都占据了8个字节,从以下代码可以看出

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a=10;
    char b=a;
    double c=12.34;
    
    int *ap = &a;
    char *bp = &b;
    double *cp = &c;
    
    printf("*ap占据%zd个字节\n",sizeof(ap));  //8
    printf("*bp占据%zd个字节\n",sizeof(bp));  //8
    printf("*cp占据%zd个字节\n",sizeof(cp));  //8
    return 0;
}

8.指针与数组 

指向数组的指针 :

int age[]={1,2,3};

int *p=age;//age 不加&。数组名就是数组的地址值。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int age[]={1,2,3,4,5,6,7};
    int *p=age;
    for (int i=0; i<7; i++) {  //遍历数值
        printf("第%d个数是%d\n",i+1,*(p+i));  //p+i 相当于取出数组中第i+1个值
    }
    return 0;
}

用下面的代码来巩固一下指针与数组的关系,设计一个函数求前n个数的和

#include <stdio.h>

int arraySum(int *p,int n)
{
    int result=0;
    for (int i=0; i<n; i++) {
        result+=*(p+i);
    }
    return result;
}

int main(int argc, const char * argv[]) {
    int number[]={12,23,45,24,35,13,24};
    int *np=number;
    int result=arraySum(np,4);
    printf("数据的和为%d",result);
    return 0;
}

9指针与字符串

1>定义方法: char s[]="jack";

char *p=s或者

char *p;

p=s;

定义字符串的两种方式

a. 利用数组

char name[] = "itcast";

特点:字符串里面的字符是可以修改的

使用场合:字符串的内容需要经常修改

b. 利用指针

char *name = "itcast";

特点:字符串其实是一个常量字符串,里面的字符是不能修改

使用场合:字符串的内容不需要修改,而且这个字符串经常使用

10.指向函数的指针

1>函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。 

2>定义的格式: 函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);

3> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)无意义,

主要用途为:  (1)调用函数(2)将函数作为参数在函数间传递。

 

 

总结:本章主要学习了指针,指针是整个C语言的精华,就像老师所说的,如果指针没有学习好,C语言学得再好也相当于没有学过C语言,可见指针在C语言学习中的重要性,而本章主要学习了指针的定义和使用注意,指向指针的指针,指针和数组,指针和字符串,指向函数的指针等,其中重点需要掌握的是指针和数组以及指针和字符串,这两个知识点相当于把整个本章的知识都整合串联到了一起,要领会指针在使用时的作用和在存储空间里的作用,指针就一个作用:能够根据一个地址值,访问对应的存储空间(包括取值和赋值),理解了这层含义指针就没什么难的。PS:本章知识是C语言重点的重点,需要多加练习,时常复习!

黑马程序员学习心得------C语言复杂数据类型之指针

标签:

原文地址:http://www.cnblogs.com/yukinoshita/p/5380128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!