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_1.c
  2.  
  3. char* p = "abcd";
  4.  
  5. 1_2.c
  6.  
  7. extern char* p[]

如果直接打印的话是打印的地址. 请仔细分析.

三、指针和数组的区别

1.指针形式访问数组元素与用数组下表形式访问数组元素两者运行效率

对比可以发现:指针形式以递增的方式访问数组元素比以下标方式访问速度更快

2.指针知识检测的一个实例(摩托罗拉面试题)

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[] = {1,2,3,4,5};
  6. int* p1 = (int*)(a + 1);
  7. int* p2 = (int*)(&a + 1);
  8. int* p3 = (int*)((int)a + 1);
  9.  
  10. printf("%d \n %d \n %d \n",p1[3],p2[-1],p3[0]);
  11. }

打印结果如下:

  1. 5
  2. 5
  3. 33554432

具体可自行分析.

3.一个处理器大小端检测的程序实例

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int a = 0x1234;
  6.  
  7. char *p1 = (char*)((int)&a);
  8.  
  9. char *p2 = (char*)((int)&a + 1);
  10.  
  11. printf("p1 = %08x,*p1 = %x !! \n",p1,*p1);
  12. printf("p2 = %08x,*p2 = %x !! \n",p2,*p2);
  13.  
  14. if((*p1) == 0x34 && (*p2) == 0x12)
  15. printf("this machine is Little edian !! \n");
  16. else
  17. printf("this machine is Big edian !! \n");
  18.  
  19. }

打印结果如下:

  1. p1 = bf84f814,*p1 = 34 !!
  2. p2 = bf84f815,*p2 = 12 !!
  3. this machine is Little edian !!

结果明了.

4.指针运算公式

指针运算可用如下公式来计算:

  1. p+n = (unsigned int)p + n*sizeof(*p) ;

从这个公式中可以看出.对于数组a来说,虽然,a和&a是相等的,但是其表示的含义一定是不一样的.

5.字符串长度

字符串长度指的是第一个'\0'结束之前的字符的个数

三、一个经典的面试题:

如何用一句话实现求字符串的长度

  1. #include <stdio.h>
  2. #include <assert.h>
  3.  
  4. int strlen(char *s)
  5. {
  6. return (assert(s),(*s ? (strlen(s+1)+1):0));
  7. }
  8.  
  9. int main()
  10. {
  11. printf("%d\n", strlen( "ddwed"));
  12. return 0;
  13. }

C语言指针和数组知识总结(上)的更多相关文章

  1. C语言指针和数组知识总结(下)

    一.数组指针: 数组指针就是一个指针,只不过它指向的是一个数组.可以通过如下方式来定义 typedef int Array[5]; //数组类型 Array* m;      //数组定义 还有一种更 ...

  2. C语言指针与数组

    C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝    -- Stan Kelly-Bootle   1. 数组并非指针 为什么很多人会认为指 ...

  3. C语言指针与数组的定义与声明易错分析

    部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...

  4. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  5. c语言指针,数组

    指针:说简单点就是一个地址.例如int *p,p是个变量,里面放的是地址0x0000,同理,每一个指针,不管什么类型,都是地址,也就是空间都是4个字节(32位机). 以此类推,指针也有指向它的指针in ...

  6. C语言指针和数组

    #include <stdio.h> int main() { /********************************************* * * 指针和数组: * 定义 ...

  7. c语言 指针与数组

    关键概念: 1.多个不同类型的指针可以对应同一个地址: 2.(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型: 3.(*p)操作 ...

  8. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  9. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

随机推荐

  1. poj 1159 Palindrome(区间dp)

    题目链接:http://poj.org/problem?id=1159 思路分析:对该问题的最优子结构与最长回文子序列相同.根据最长回文子序列的状态方程稍加改变就可以得到该问题动态方程. 假设字符串为 ...

  2. C# RSA在服务上使用出现拒绝方法错误的解决方法

    在做一个快钱接口的时候,遇到了.net RSA加密无法在一台win2008服务器上运行正常,更换到Win2003服务器后出现问题,具体表现如下: “/”应用程序中的服务器错误. ----------- ...

  3. 解决JSP中,类无法被编译的问题(XX cannot be resolved to a type)

    错误调试解析: An error occurred at line: XX in the jsp file: /XX.jsp XX cannot be resolved to a type 解决方法: ...

  4. javascript 数组部分

    <html> <body> <script type="text/javascript"> var arr = new Array(6) arr ...

  5. WebView之2

    首先需要添加权限: <uses-permission android:name="android.permission.INTERNET"/> MainActivity ...

  6. Android的ProgressBar

    注意点: 必须在setContentView 前面设置,否则会报错. 重要的方法: progress.incrementProgressBy(int diff);//参数为进度数,进度满了为100.不 ...

  7. 安装uwsgi

    apt-get install uwsgi uwsgi-plugin-python

  8. POJ 1861 Network (模版kruskal算法)

    Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: Accepted: Special Judge Descripti ...

  9. 基于FPGA的DW8051移植(三)

    总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...

  10. 什么时候需要交换Top Level ?

    什么时候需要交换Top Level ? 上一篇中提到,如果采用仿真的时候,运用门级仿真就需要进行顶层交换,RTL仿真不需要,那么什么时候需要呢? QuartusII 向下包含,在Project Nav ...