设为首页 加入收藏

TOP

数组与指针、变量、字符数组、结构体及其他总结(二)
2019-07-25 14:17:55 】 浏览:233
Tags:指针 变量 字符 结构 及其他 总结
排长纵向按班(行)点名,行指针(指向数组的指针);班长横向按战士(列)点名,列指针(指向某个元素的指针);每个具体的战士则为二维数组的元素。

小结:

(参考书:C程序设计第四版-谭浩强-P245-248,推荐详细看这本书这段,讲的很清楚,本文如有问题,欢迎指正)

二维数组名指向行;一维数组名指向列元素。

在指向行的指针前加*可转换为指向列的指针。*(a+i)a[i](指向列)等价,如:*(&a[1])=a[1](取a[1]地址,并指向该地址),a+1=&a[1]a[1]为第一行,是一个一维数组,取该一维数组(行)的地址) => *(a+1)=a[1]

在指向列的指针前加&可转换为指向行的指针。a[1]为一维数组名(1行),指向a[1][0]10列首地址;&a[1]为取a[1](一维数组名,1行)的地址,故指向变为行首地址。   

(2)一维数组与指针:

  例:

int a[5]={1,2,3,4,5};

int *ptr = (int *)(&a+1);

printf(“%d\n”,*(ptr-1));

先看int *p=&a;在编译时会弹出警告,&a为取一维数组名a(可理解为0行)的地址,则所定义指针应指向整个一维数组(该行),也可按上述“在指向列的指针前加&可转换为指向行的指针”来解释。(当&a[0]时,仅为一个元素的地址,无所谓行列)。

因此,应这样定义:int (*p)[5] = &a;p指向含有5个元素的一维数组),此时编译无警告,若输出pp+1的值,发现二者相差为5个整型元素所占空间,即所加空间等于该一维数组所占空间。

&a+1a+5的值是相同的,指向同一个地址,但含义不同(注意此处a为一维数组):前者为1行的首地址,加操作时加的是该数组所占空间(行);后者为在一维数组名基础上加,一维数组名指向该数组首元素地址,指向列,加1操作时加的是该数组中一个元素所占空间。但a[5]的值实际上是未知的。

实际上int *ptr = (int *)(&a+1);等价于int *ptr = *(&a+1);由上述分析,&a+1是一维数组(一行)的首地址,而ptr指向该地址,则指向该行的首地址,即指向列,也就是int型指针,而不是指向一维数组,因此该定义不会出现警告。这也与上述“在指向行的指针前加*可转换为指向列的指针”相符。

因此,(ptr-1)( *(&a+1) -1 ),指向列的指针-1即为指针后退一个数组元素所占空间,故为指向a[5],所以*(ptr-1)值为a[5]=5

参考链接:https://blog.csdn.net/wangkaiblog/article/details/7724790

2019-07-19

1、关于转义字符:\八进制数字,\x十六进制数字,输出该八进制码对应的ASCII字符。

  如:printf( "\101\x41" );输出结果:AA。'A'的ASCII值是65,对应八进制101,十六进制41。

  在定义变量时,如:int a = 0101;(八进制数0开头)或int a = 0x41;(十六进制数0x开头),按%d形式输出结果为65,%c形式输出结果为A。

2、条件运算符:表达式 ?若为真 :若为假。

3、指定输出数据长度%列数d,如:int a = 5678;按%2d输出为5678;按%5d输出为 5678,输出数据共占5列,5678前有一个空格。即这种方式输出不会损失整数部分的数据。

  如:float b = 56.55;按%2.4f输出为56.5500;按%6.1f输出为  56.5,输出数据占6列,小数部分按(>5进,<=5舍)处理。

4、C语言中,函数间可以互相调用,但不能调用main函数,main函数是被操作系统调用的。

5、C源程序编译和运行过程:编译(预编译和正式编译,生成二进制目标程序.obj)-> 连接(生成可执行程序.exe) -> 运行。其中预编译阶段处理预处理命令行,将需要包含的头文件内容读入取代#include <xx>行,再进行正式编译,检查语法错组。这些由集成环境(IDE)完成。

6、一个常见的字符串使用错误:char a; char *str = a; strcpy(str,"hello");这段程序的错误在于:没有给str分批内存空间,将会发生异常。

7、求数组table的元素个数:sizeof(table)/sizeof(table[0])

8、指针数组与指向函数数组的指针:

  int *p[4];           //一个指针数组,每个数组元素都可指向一个整型变量。[]优先级高于*,因此先为数组,后才为指针,故为指针数组。

  int (*p[10])(int)    //一个指向函数的指针数组,每个数组元素都可指向函数类型为整型且只有一个整型参数的函数。

9、关于常量指针与指向常量的指针:详细参考链接:https://www.cnblogs.com/bencai/p/8888760.html

  如:char * const p = &c; //p为常量指针,p的值不可以修改,如再有:p=&d;则该语句是不合法的,即编译不通过。若定义时去掉const,则没有问题。

    const char * p = "acs" 与 char const * p = "acs"含义相同,p是指向常量的指针,所指向的常量值不能修改,但p可以重新赋值。如:p[0]='b'是不合法的,但:p = &c;是合法的。

  如:char * p = "acs";   //该指针p的定义存在问题(虽然编译可通过),由于p指向了常量,因此应定义为 const char * 类型;若再有p[0] = 'a';语句则运行时会出现异常,导致该程序停止工作。所以,在定义时就应该定义为指向常量的指针,防止后续对所指向常量的非法更改带来的运行错误,如:若将p定义为const char * 类型,则在编译时就会对p[0] = 'a';语句报错

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2019牛客暑期多校训练营(第二场.. 下一篇已知结点地址,如何访问父结构?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目