前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言基础学习07_关于指针的复习

c语言基础学习07_关于指针的复习

作者头像
黑泽君
发布2018-10-11 16:07:31
4220
发布2018-10-11 16:07:31
举报
文章被收录于专栏:黑泽君的专栏

=============================================================================

指针变量之间赋值是需要兼容的。

例如: int *a = int的地址 char *b= char的地址 -------------------------------------- void类型的指针可以做任意类型地址的赋值操作。 例如: void *p = int地址可以 p = char地址也还可以

但void类型的指针不能做指针运算。 例如: p++; //会出现问题 -------------------------------------- 指针与数组的关系 int a[10]; int *p = a;   //初始化的时候就指向了首地址,相当于int *p = &a[0]; 也相当于int *p; p = a; 也相当于int *p; p = &a[0]; p[3] = 8;    //等价于*(p + 3) = 8;该p[3]对应的是下标为3的元素。

p += 2;      //指针进行运算后 p[3] = 0;   //此时的p[3]对应的元素为下标为5的元素。

a += 2;     //这样写是错误的,因为数组名是一个地址的编号,是一个常量(该常量的解释是:变化的常量。因为每一次运行程序时,地址编号都会发生变化,所以是变化的;又因为一旦程序运行了,那么地址的编号就随之确定了,不能改变了,所以就是常量了!)

p = a + 2;   //因为int *p; p = a; 所以p += 2; --> p = p + 2; --> p = a + 2;  //又因为a是一个地址编号,是一个常量,可以做右值的。 -------------------------------------- 指针的运算:指针的加减不是普通整数的加减

例如: int ab[10]; short *p = ab;    //一个short类型的指针变量,指向了一个int型的地址,但不影响p本身的类型。 p += 2;      //p在内存中移动了4个字节, 结果是移动到了ab[1]的地址了。 int *p1 = ab; p1 += 2;        //p在内存中移动了8个字节,移动到了ab[2]的地址了。

short abc[10]; p1 = abc; p1 += 3;       //这时p1移动了12个字节。

指针运算的时候,不要在意指针具体指向一个什么样类型的地址,要在意的是指针本身是什么样的类型。 -------------------------------------- 指针数组:main函数的参数就是一个典型的指针数组(也即二级指针)。

int *a[10];    //定义了一个数组,名字叫a,有10个成员,每个成员的类型是int *,成员分别为a[0]、a[1]、......、a[9]。 char *b[10];      //定义了一个数组,名字叫b,有10个成员,每个成员的类型是char *,成员分别为b[0]、b[1]、......、b[9]。 sizeof(a) = 8 个字节, sizeof(b) = 8 个字节。 -------------------------------------- 该定义一个什么类型的指针才能指向指针数组b(char *b[10];)呢? 答: char **p = b; p[0]是char *类型。此时p[0] = b[0]; p[1] = b[1]; ...... p[9] = b[9];

若如下这样定义的话,就不兼容: char *p = b; 此时的p[0]是char类型。 但b[0]本身是什么类型呢?答:b[0]是char *类型。此时 p[0] 不等于 b[0]了。 -------------------------------------- 该定义一个什么类型的指针才能指向数组b(char b[10];)呢? 答: char *p = b; 此时的p[0]是char类型,此时p[0] = b[0]; p[1] = b[1]; ...... p[9] = b[9]; -------------------------------------- 指向指针的指针(二级指针)

int *p; *p是什么类型?答:int类型。

int ***p *p是什么类型?答:int **类型。 **p是int *类型。 ***p是int类型。 -------------------------------------- 指针变量作为函数参数 如果想要通过函数内部修改外部是实参的值,就需要给函数的参数传递之歌实参的地址。 -------------------------------------- 一维数组名作为函数参数

一维数组名一旦作为函数参数,c语言将数组名解释为一级指针变量。(由数组名(常量)变为指针变量名(变量)) int abc(int a[10]) int abc(int a[]) int abc(int *a)

如果将一个数组作为函数的形参进行传递,那么数组内容可以在被调用的函数内部进行修改, 很多时候,我们不希望这样的事情发生,所以用到const对形参进行修饰。(尽管此种修饰方法没有用!) int abc(const int a[10]) -------------------------------------- 指针 和 字符串 在c语言中,大多数的字符串(字符数组)操作其实就是指针操作。

例如:

代码语言:javascript
复制
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     char s[20] = "hello world";
 6     char *p = s;
 7     p[0] = 'a';
 8     *p = 'b';
 9     
10     printf("%s\n", s);         //bello world
11     
12     char *c = "hello world";
13     //c[0] = 'a';//编译没有问题,但运行会出现段错误。因为c指向的是一个常量。
14 
15     printf("%d\n", *c);        //104
16     printf("%d\n", c[0]);    //104
17     printf("%d\n", c[1]);    //101
18 
19     return 0;
20 }

-------------------------------------- char a[100] = "hello world";   //定义一个数组,有100个char,同时初始化数组成员变量的值。 char *p = a;            //定义一个char *类型的指针p,p指向char类型数组的首元素地址。 char *s = "hello world";       //定义了一个字符串常量,s指向这个常量的首地址。 const char *s = "hello world";  //定义了一个字符串常量,s指向这个常量的首地址。(更严谨的写法)

a[0] = 'a'; //合法的,因为数组a的所有成员都是变量。 s[0] = 'a'; //非法的,因为s指向的是一个常量。 -------------------------------------- char *作为函数的参数

此时函数的参数是字符串。 -------------------------------------- 如果函数的参数是一个数组,那么函数内部是不知道这个数组成员数量的,所以函数的形参需要额外再增加一个参数,说明数组成员数量。 如果函数的参数是一个字符串(本质是字符数组),那么就不需要增加额外参数说明字符串字符数量了。 -------------------------------------- 指针数组作为main函数的参数(即形参)

int main(int a, char *b[10] int main(int a, char *b[]) int main(int a, char **b) int main(int argc, char **args)

main函数的第一个参数是标示第二个参数有几个成员,不要尝试修改main函数的参数的顺序。 =============================================================================

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档