C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上)
一、指针的基础
1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x
2.指针的本质
指针的本质就是变量,那么既然是变量,那么一定会分配地址.只不过指针里面保存的是地址.
3.传递地址和传递值的区别
函数传参数只是一个赋值/拷贝的作用,所以在函数值传递和地址传递有如下区别:
值传递不能改变函数体外部的变量,地址传递可以改变函数体外部的变量.
4.那么什么场合需要用到地址传递呢?
注意两点:
第一个是实现对函数体外部的变量进行修改
第二个是复杂函数数据类型传递的时候(极大的提高了C语言的执行效率)
5. #define led(m) m?(n = 1):(n = 0)
6.注意const的用法
int const* p 和 int *const p的区别
二、数组的基础
1.数组是相同类型变量的有序集合.
2.数组名代表数组首元素的地址.
3.数组的地址需要用取址符号才能够取到.
4.数组首元素的地址值和数组的地址值是一样的.
5.数组首元素的地址和数组的地址是两个不同的概念.
6.数组和指针一个非常重要的区别
1_1.c中 char* p = "abcd"; 1_2.c中 extern char* p[]
如果直接打印的话是打印的地址. 请仔细分析.
三、指针和数组的区别
1.指针形式访问数组元素与用数组下表形式访问数组元素两者运行效率
对比可以发现:指针形式以递增的方式访问数组元素比以下标方式访问速度更快
2.指针知识检测的一个实例(摩托罗拉面试题)
#include <stdio.h> int main()
{
int a[] = {1,2,3,4,5};
int* p1 = (int*)(a + 1);
int* p2 = (int*)(&a + 1);
int* p3 = (int*)((int)a + 1); printf("%d \n %d \n %d \n",p1[3],p2[-1],p3[0]);
}
打印结果如下:
5
5
33554432
具体可自行分析.
3.一个处理器大小端检测的程序实例
#include <stdio.h> int main()
{
int a = 0x1234; char *p1 = (char*)((int)&a); char *p2 = (char*)((int)&a + 1); printf("p1 = %08x,*p1 = %x !! \n",p1,*p1);
printf("p2 = %08x,*p2 = %x !! \n",p2,*p2); if((*p1) == 0x34 && (*p2) == 0x12)
printf("this machine is Little edian !! \n");
else
printf("this machine is Big edian !! \n"); }
打印结果如下:
p1 = bf84f814,*p1 = 34 !!
p2 = bf84f815,*p2 = 12 !!
this machine is Little edian !!
结果明了.
4.指针运算公式
指针运算可用如下公式来计算:
p+n = (unsigned int)p + n*sizeof(*p) ;
从这个公式中可以看出.对于数组a来说,虽然,a和&a是相等的,但是其表示的含义一定是不一样的.
5.字符串长度
字符串长度指的是第一个'\0'结束之前的字符的个数
三、一个经典的面试题:
如何用一句话实现求字符串的长度
#include <stdio.h>
#include <assert.h> int strlen(char *s)
{
return (assert(s),(*s ? (strlen(s+1)+1):0));
} int main()
{
printf("%d\n", strlen( "ddwed"));
return 0;
}
C语言指针和数组知识总结(上)的更多相关文章
- C语言指针和数组知识总结(下)
一.数组指针: 数组指针就是一个指针,只不过它指向的是一个数组.可以通过如下方式来定义 typedef int Array[5]; //数组类型 Array* m; //数组定义 还有一种更 ...
- C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指 ...
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- c语言指针,数组
指针:说简单点就是一个地址.例如int *p,p是个变量,里面放的是地址0x0000,同理,每一个指针,不管什么类型,都是地址,也就是空间都是4个字节(32位机). 以此类推,指针也有指向它的指针in ...
- C语言指针和数组
#include <stdio.h> int main() { /********************************************* * * 指针和数组: * 定义 ...
- c语言 指针与数组
关键概念: 1.多个不同类型的指针可以对应同一个地址: 2.(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型: 3.(*p)操作 ...
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
随机推荐
- 转: requirejs压缩打包r.js使用示例 2 (~~很详细的教程)
这一篇来认识下打包工具的paths参数,在入门一中 就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”, 但 ...
- 用macports装了一份openssl
我已经用macports装了一份openssl,然后自己又编译了一份openssl....第三方给Mac出的一个类似BSD Ports的一个软件包管理工具装的话只需要sudo port install ...
- STL assign 和swap
首先看下在整个container上面的复制. c1=c2 可以等同于 c1.erase(c1.begin(),c1.end()) //delete all elems in c1 c1.insert( ...
- BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
题目 1613: [Usaco2007 Jan]Running贝茜的晨练计划 Time Limit: 5 Sec Memory Limit: 64 MB Description 奶牛们打算通过锻炼来 ...
- Strategic Game(匈牙利算法,最小点覆盖数)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ZigBee研究之旅(二)
在学习ZigBee设备CC2530模块时,编程后程序无法运行,但又十分确定程序的真确性的情况下,看看是不是project栏下的option选项配置的有问题,我是经常在这里出问题,一开始找不到原因,特此 ...
- 企业级IM应该帮助员工提高绩效,避免无关的信息干扰
很多上班族一定熟悉如下的场景: 您早上上班一打开QQ,就弹出一个新闻集成窗口,随便点开看看吧,这一点不要紧,您就被一个又一个的链接带着逛下去了.等回过神来要工作的时候,发现已经在这些八卦新闻上浪费了一 ...
- 【Maven】项目添加Maven类库依赖
1.右击项目-->Maven-->EnableDependencyManagement,按步骤完成操作. 2.右击项目-->Properties-->DeploymentAss ...
- C++静态成员函数和静态成员变量的探索
静态数据成员属于类,非属于类对象,所以,定义位置就有了限制. 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员).类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以 ...
- 提高你开发效率的十五个Visual Studio 2010使用技巧
提高你开发效率的十五个Visual Studio 2010使用技巧 相信做开发的没有不重视效率的.开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS.能够对一个IDE产生依赖,说明这个ID ...