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

众所周知,指针是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语言重点的重点,需要多加练习,时常复习!

时间: 2024-10-24 15:54:13

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

黑马程序员学习笔记--------C语言变量类型,结构体,枚举

本章学习的知识是定义结构体,枚举等自定义的数据类型,已经宏命令,变量类型等细小的知识点,在开始本章的新知识学习之前首先我们要明白的是C语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储.变量也是有分类型的,不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型.生命周期). 一.变量类型 变量分为全局变量和局部变量. 首先说明一下局部变量的特点 1> 定义:在函数内部定义的变量,称为局部变量.形

黑马程序员--C语言基础--指针

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* 1.指针的定义格式: 数据类型 *指针变量名 2.指针的赋值: 指针变量内存储的是指针所指向变量的地址 指针变量名=&... 或者 指针变量名 =数组名 注意:定义的时候 * 仅代表这是在定义一个指针变量,没有其他的意义 *

黑马程序员学习笔记2014/7/5

观看视频:011_标识符_黑马程序员_Java基础视频.avi Java语言的基础组成 关键字.标识符.注释.常量和变量.运算符.语句.函数.数组.   关键字     标识符 1.在程序中自定义的一些名称 2.由26个英文字母大小写,数字,0-9符号 :_ $ 组成 3.定义合法标识符的规则: a.数字不可以开头 b.不可以使用关键字 4.Java中严格区分大小写 5.注意:在起名的时候尽量起一个有意义的名称       观看视频:012_常量_黑马程序员_Java基础视频 常量与变量 Jav

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

黑马程序员学习笔记_OC之给NSString增加分类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! ---------------------- 黑马程序员学习笔记_OC

黑马程序员学习笔记-OC之foundation框架

黑马程序员学习笔记-OC之foundation框架 1.简介:foundation框架是其它所有ios框架的基础,包含了很多常用类型,结构体.枚举.类等. 2. 结构体:NSRange表示范围的结构体. NSPoint/CGPoint表示坐标点的结构体 NSSize/CGSize表示宽高的结构体 NSRect/CGRect表示坐标点+宽高的结构体 3. 类字符串:NSString  字符串类 NSMUtableString  易变字符串类 NSArray         数组类 NSMUtabl

黑马程序员-学习日记(面向对象)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.面向对象  理解面向对象  面向对象是相对面向过程而言,面向对象和面向过程都是一种思想. 面向过程: 强调的是功能行为.代表语言:C语言. 例子:把大象装进冰箱 1.打开冰箱门.2.放入大象.3.关上冰箱门."打开"."存储"."关上"都是功能行为,在代码中的直观体现就是函数或者方法,这就是一种面向过程的以功能行为为主体的思想体现. 面向对

黑马程序员-学习日记(接口和多态)

1.继承 1-1 继承的概念 1-1-1 继承的概述 通过 extends 关键字让类与类之间产生继承关系. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类或者超类. 注意: ①子类可以直接访问父类中的非私有的属性和行为. ②子类无法继承父类中私有的内容.③父类怎么来的?共性不断向上抽取而来的. ExtendDemo.java class Person{ String name; int

学习心得------C语言复杂数据类型

---恢复内容开始--- 在学习c语言的过程中,最复杂的知识便是标题中的复杂数据类型了,因为包括了数组,字符串,指针等多种数据类型,在这一环节中,我们不免要接触到内存,分析出该数据类型的在内存中的存储方法,就可以比较明确的认识到该类型的运行原理,下面就分析一下我在学习该视频中的学习心得吧. 一.数组 1.数组,从字面上看,就是一组数据的意思,是的,数组的作用就是用来存储一组数据的.数组的特点是只能存放同一类型的数据,比如int 比如double. 2.数组的格式,元素类型 数组名[元素个数]