IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言课堂知识小结4——指针进阶 -> 正文阅读

[C++知识库]C语言课堂知识小结4——指针进阶

一、知识小结:

1、数组名通常表示数组首元素的地址,但是有两个例外

? 1) sizeof(数组名)? 这里的数组名表示整个数组,计算的是整个数组的大小。

? 2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

2、sizeof只是一个操作符,不访问括号里的内容,计算的的对象是所占内存的大小-单位是字节,返回的类型是 size_t。

3、strlen是一个库函数,计算的是字符串的长度,遇到'\0'停止。


二、指针笔试题

1、

int main()
{
? ?int a[5] = { 1, 2, 3, 4, 5 };
? ?int *ptr = (int *)(&a + 1);
? ?printf( "%d,%d", *(a + 1), *(ptr - 1));
? ?return 0;
}

思路:a是数组名,表示数组首元素地址,+1表示跳过一个整型,*(a+1)等价于a[1],所以*(a+1)的值是1。&a取出的是整个数组的地址,&a+1 表示跳过一整个数组,(int*)(&a+1) 表示把&a+1地址强制类型转换为整型,ptr是一个指针变量,内存中存的是(&a+1)的地址,*(ptr-1)表示对(&a+1)的地址减去四个字节后的地址解引用,结果是5。

2、
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
 int Num;
 char *pcName;
 short sDate;
 char cha[2];
 short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
int main()
{
 printf("%p\n", p + 0x1);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

p是结构体指针,p+0x01表示p加一,向后跳过一个结构体类型的字节,20个字节,由于这里是按16进制算的,20=0x14;? 所以:0x100000+20=0x100014;

p中存放的是一个地址0x100000,经过强制类型转换后,(unsigned long)p只是一个普通的无符号长整型的变量,只是一个普通的变量,没有指针的含义,所以?(unsigned long)p+1=0x100000+1=0x100001

地址p经过强制类型转换后成为一个整型的指针变量,p+1表示向后跳过一个整型变量,p+1=100004;

3、

int main()
{
 ? ?int a[4] = { 1, 2, 3, 4 };
 ? ?int *ptr1 = (int *)(&a + 1);
 ? ?int *ptr2 = (int *)((int)a + 1);
 ? ?printf( "%x,%x", ptr1[-1], *ptr2);
 ? ?return 0;
}

(int*)(&a+1)表示把(&a+1)的地址强制类型转换为整型,ptr1[-1]? 等价于 *(ptr1-1)=4;

(( int)a+1)? a是数组首元素的地址,int a表示把a强制类型转换为一个普通变量,+1只加一个数,接着把这个数强制类型转换为int*类型。*ptr2对该处的地址解引用,因为是整型,所以要解引用四个字节。数据存放的形式是小端,所以这个数是 02000000.

%x? 是十六进制

?4、

#include <stdio.h>
int main()
{
 ? ?int a[3][2] = { (0, 1), (2, 3), (4, 5) };
 ? ?int *p;
 ? ?p = a[0];
 ? ?printf( "%d", p[0]);
 return 0;
}
注意:? int a [ 3 ][ 2 ] = { ( 0 , 1 ), ( 2 , 3 ), ( 4 , 5 ) };中是,表达式,所以在数组中,只存放了1,3,5这个元素。p[0]等价于 a[0][0] =1;
5、
int main()
{
 ? ?int a[5][5];
 ? ?int(*p)[4];
 ? ?p = a;
 ? ?printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
 ? ?return 0;
}

p是一个数组指针,p+1向后跳的是数组的大小。p[4][2]== *(*(p+4)+2)

?地址之间的加减是之间的元素个数,所以这两个值得结果是-4.

-4以%d打印出还是-4 ,-4得原码是10000000?00000000?00000000?00000100

反码:111111111111111111111111111111111011

补码:111111111111111111111111111111111100

%p是专门打印地址的,所以这个值为ff ff ff f4

6、

int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}

数组a[]中,存放的是字符串的首地址,所以类型是char*。二级指针变量pa中存放的是a[]的首元素地址,p++就是(a+1),*pa =*(a+1)访问的字符串at的首地址,打印出来是at

7、

int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}

思路:数组c[]存放的是每个字符串的首地址,二级指针cp存放的是c[]中字符串的地址,三级指针存放的是数组cp的首元素地址。

第一问:**++cpp,++优先级高于* ,所以先++,在解引用。 cpp++等价于 cp++,cpp指向的是cp[]中的c+2,*cpp就是c+2,*(c+2)就是c[]中的"POINT" P 的首元素地址。打印的是字符串"POINT"

第二问:cpp 此时已经指向c+2 ,cpp++ 指向cp[]中的c+1,? c+1在--后指向的是c[]中的"E"的首地址,解引用后在+3 ,此时指向的是字符串"ENTER"中的第三个元素的地址,即E,从E开始打印,打印出的结果是ER。

第三问:*cpp[-2] 等价于 *(*(cpp-2))? cpp此时指向的是c+1,cpp-2后指向的是cp的首元素地址,即解引用后是c+3,是字符串"FIRST"的地址,+3表示指向S,从S开始打印,打印两个字符,结果是ST。

第四问:cpp[-1][-1]等价于* (*(cpp-1)-1),cpp此时还是指向的c+1,cpp-1后指向的是c+2,*(c+2-1)指向的是字符串"NEW"的首元素地址,+1是"E"的地址,从E开始打印,结果是EW。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 20:58:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 3:42:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码