黑马程序员技术交流社区

标题: <分享>很多人说指针难 这是我对指针看完后的总结 [打印本页]

作者: 陌生爱人    时间: 2014-10-10 15:56
标题: <分享>很多人说指针难 这是我对指针看完后的总结
本帖最后由 陌生爱人 于 2014-10-10 15:58 编辑

MJ老师说过没学好指针 等于没学C语言。c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。C中函数调用是按值传递的,指针所做的是地址的传递。(*p)操作是返回p 的值作为地址的那个空间的取值。(&p)则是这样一种运算,返回当时声明p 时开辟的地址。


一、指针变量的定义

1. 格式:变量类型 *指针变量名;

2. 举例:int *p;   char *p2;

3. 注意:定义变量时的*仅仅是指针变量的象征

4. 指针变量只能存储地址

5. 指针就一个作用:能够根据一个地址值,访问对应的存储空间

6. 指针变量p前面的int:指针变量p只能指向int类型的数据

7. 指针变量未经过初始化,不要拿来间接访问其他存储空间

8. 任何指针都占用8个字节的存储空间



二、利用指针变量简单修改其他变量的值

1.指向某个变量


int a;

int *p;

p = &a;

或者

int *p = &a;


2.修改所指向变量的值


*p = 10;


3.在函数内部修改外面变量的值


int a = 10;

change(&a);



void change(int *n)

{

    *n = 20;

}


4.指向指针的指针


int a = 10;



int *p = &a;



int **pp = &p;


三、指针与数组


1.将数组当做函数参数传入时,会自动转为指针

1.数组元素的访问方式

int ages[5];

int *p;

p = ages;

1> 数组名[下标]  ages

2> 指针变量名[下标] p

3> *(p + i)


2.指针变量+1,地址值究竟加多少,取决于指针的类型


int *   4

char *  1

double * 8
指针在内存中的存储方式
// 0000 0000 0000 0000 0000 0000 0000 0010
    int i = 2;
    // 0000 0001
    char c = 1;


利用一个指针来接收一个数组,指针变量指向了数组的首元素,数组名就是数组的地址,也是数组首元素的地址


四、指针与字符串


1.定义字符串的2种方式

1> 利用数组

char name[] = "itcast";

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

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



2> 利用指针

char *name = "itcast";

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

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


2. 计算一个字符串的字符个数


int string_len(char *s)

{

    // 记录字符的个数

    int count = 0;



    // 如果指针当前指向的字符不是'\0'

    while ( *s != '\0')

    {

        // 个数+1

        count++;



        // 让指针指向下一个字符

        //s = s + 1;

        s++;

    }

    return count;

}


3.定义字符串数组


1> 利用二维字符数组

char names[2][10] = {"jack", "rose"};



2> 利用指针数组

char *names[2] = {"jack", "rose"};


五.指向函数的指针


定义:

double (*p)(double, char *, int);

p = haha;

或者

double (*p)(double, char *, int) = haha;

3.如何间接调用函数

1> p(10.7, "jack", 10);

2> (*p)(10.7, "jack", 10);



int (*p)(int, int);

// 定义指针变量指向sum函数

// 左边的int:指针变量p指向的函数返回int类型的数据

// 右边的(int, int):指针变量p指向的函数有2个int类型的形参

p = sum;

int c = (*p)(10, 11);

printf("c is %d\n", c);


     特例没有返回值的函数

     void (*p)();


// (*p)是固定写法,代表指针变量p将来肯定是指向函数

// 左边的void:指针变量p指向的函数没有返回值

// 右边的():指针变量p指向的函数没有形参

void test()

{

    printf("调用了test函数\n");

}

p = test;  // 指针变量p指向了test函数

p(); // 调用函数等同于test();

这是我博客里总结的一篇,博客已经提交 如果通过后 会将更多博客整理的条目分享给大家


作者: 陌生爱人    时间: 2014-10-10 15:58
本来是彩色的 一发出来 变成这样乱了  没办法了,编辑器问题
作者: 微雨独行    时间: 2014-10-11 01:50
支持楼主,365个赞




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2