C指针与数组之间的细节
看以下代码:
#include <stdio.h>
void f(char**);
int main()
{
char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
f(argv);
return 0;
}
void f(char **p)
{
char *t;
t = (p += sizeof(int))[-1];
printf("%s\n", t);
}
觉得执行后的值为多少呢?
正确答案为: gh
这里用到了double指针,也就是把指针的变量值传递给只接受指针参数的函数f(char**),函数里面的double 指针p最终结果是指向一个已经分配好值的数组单元。这个数组为["ab", "cd", "ef", "gh", "ij", "kl"]。
定位到函数f(char **p),里面有一句话: t = (p += sizeof(int))[-1]。这里先将p指针移动一下位置,把p的地址递增了4个字节。由于最初的p指针指向了数组的第一个元素ab,这里移动了4个字节,那么就是从ab元素后面再数4个元素,也就定位到了ij元素。然后执行[-1]操作,这个操作等价于(p-1),意思是把指针往前面移动一个位置,也就是定位到了gh。注意了,一般看到p[-1]这种写法,其实把它看作(p-1)就好了。
最后是输出结果,这里当然为gh。(前提是int类型等于4个字节)
C指针与数组之间的细节的更多相关文章
- C++中指针和引用、数组之间的区别
		指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ... 
- C指针和数组的关系详解
		1.C中数组和指针的关系 对于任意类型的数组arr,对于同类型的指针类型parr(确切一点,可以假设类型为int,即int arr[], *parr).它们之间有如下"内幕": 1 ... 
- 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)
		主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[ ... 
- void指针和数组指针之间的转换
		由于void* 可以被任何指针赋值,所以以void*作为函数参数可以使得接口更容易接受不同类型的参数,不过需要注意的时,实际操作时还需要利用强制类型转换,将指针转换为原类型,否则在内存上会有问题. 一 ... 
- C语言中指针和数组
		C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之 ... 
- 深入理解C语言中的指针与数组之指针篇
		转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ... 
- 深入理解C语言中的指针与数组之指针篇(转载)
		前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ... 
- C语言的本质(11)——指针与数组
		1.指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是"储存指针的数组 ... 
- 浅谈C中的指针和数组(五)
		前面写了一些C指针和数组的一些知识,但是还有一些很重要的知识没有交代,这里做一个补充. 首先看一下,普通变量(指针也是变量)和数组名查看地址的方式是不同的. 查看数组变量的地址,不需要使用 & ... 
随机推荐
- 786. K-th Smallest Prime Fraction
			A sorted list A contains 1, plus some number of primes. Then, for every p < q in the list, we co ... 
- PHP 遍历一个文件夹下所有文件和子文件夹的方法
			话不多说,直接上代码 <?php function my_dir($dir) { $files = []; if(@$handle = opendir($dir)) { while(($file ... 
- Python基础知识(1)
			Python 3 1:print:输出信息 例子: ( 所有的标点符号都要是英文状态下输入,要不然会报错) print(“hello world”) 2:注意 : python 和 pyth ... 
- Spring + MyBaits java.lang.reflect.InvocationTargetException 启动日志报错
			调试发现 实例化 class org.apache.ibatis.logging.slf4j.Slf4jImpl时发生异常,所以 slf4j jar 问题解决: http://www.cnblogs. ... 
- Selenium | 基础入门
			在maven项目搭建环境: <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifact ... 
- Github配置SSH连接
			安装git.exe,打开Git Bash 1.检查是否已经有SSH Key. $cd /.ssh 2.生成一个新的SSH. $ ssh-keygen -t rsa -C "email@git ... 
- Tcp实现省略编码
			import socket class My_socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = ... 
- android 7.0 应用间文件共享FileProvider
			1.官方教程 Android 7.0 以后安全系数提高,应用间文件共享要使用FileProvider.原来的 file:/// Uri 替换为 content://Uri https://devel ... 
- OGG How to Resync Tables / Schemas on Different SCN s in a Single Replicat
			To resync one or more tables/schemas on different SCN's using a single or minimum number of replicat ... 
- Backbone.js入门教程第二版笔记(3)
			视图渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ... 
