指针与数组

1. c语言只有值传递,没有引用传递

  • 可通过指针交换
#include <stdio.h>
#include <stdlib.h>
void swap(int* a, int* b){
int tmp = *b;
*b = *a;
*a = tmp;
}
int main(void) {
int a = 2;
int b = 3;
swap(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
  • 但以下代码在c++环境下才能运行
void swap(int& a, int& b){
int tmp = b;
b = a;
a = tmp;
}
int main(void) {
int a = 2;
int b = 3;
swap(a, b);
printf("%d %d\n", a, b);
return 0;

2. (*ip)++

如果实现对ip所指对象进行自增,(*ip)++ 中的括号是必须的。否则改表达式对ip进行+1运算,而非对ip所指对象进行+1运算。因为类似于* 、++这样的一元运算符遵循从右至左的结合顺序。

3. char s[]和 char* s是等价的

s是字符数组的起始地址

4. C语言不进行数组越界检查

arr[-1],arr[-2]表示arr[0]之前的两个元素

#include <stdio.h>
#include <stdlib.h> int main(void) {
int c[2] = {0,0};
printf("%d %d\n", c[-1], c[-2]);
return 0;
}

输出:

32767 -502976128

5. void*是一种特殊的指针类型

可以用来存放任意对象的地址。一个void指针存放着一个地址,这一点和其他指针类似。不同的是,我们对它到底储存的是什么对象的地址并不了解。

6. strcpy的实现

  • 通过数组实现
void strcpy_a(char* s, char* t){
int i = 0;
while((s[i] = t[i]) != '\0')
i ++;
}
  • 通过指针实现
void strcpy_p(char* s, char* t){
while(*s++ = *t++);
}

7. strcmp的实现

  • 通过指针实现
int strcmp_p(char* s, char* t){
for(;*s == *t; s++, t++){
if(*s == '\0') return 0;
}
return *s - *t;
}
  • 通过数组实现
int strcmp_a(char* s, char* t){
int i;
for(i = 0; s[i] == t[i]; i++)
if(s[i] == '\0') return 0;
return s[i] - t[i];
}

8.命令行参数

main(int argc, char* argv){}

argc表示程序运行时命令行中参数的数目;argv指向字符串数组的指针,每个字符串对应一个参数

  • 实现say程序:
#include<stdio.h>
int main(int argc, char* argv[]){
printf("%d\n", argc);
for(int i = 0; i < argc; i++){
printf("%s\n",argv[i]);
}
return 0;
}
  • 命令行运行:

    gcc say.c -o say

    ./say hello world

  • 输出:

c程序设计语言 by K&R(二)指针与数组的更多相关文章

  1. C程序设计语言(K&R) 笔记2

    (1) #include <stdio.h> main(){ int c; while((c = getchar()) != EOF){ putchar(c); } } 注意,因为 != ...

  2. C程序设计语言(K&R) 笔记1

    当作复习... (1)将华氏度 换算成 摄氏度,公式: ℃=(5/9)(̧°F-32) #include <stdio.h> int transformTemprature(int F){ ...

  3. 《C程序设计语言》笔记(二)

    四:函数与程序结构 1:函数之间的通信可以通过参数.函数返回值以及外部变量进行. 2:如果函数定义中省略了返回值类型,则默认为int类型.如果没有函数原型,则函数将在第一次出现的表达式中被隐式声明,比 ...

  4. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  5. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  6. 《C程序设计语言》(K&R)中文高清非扫描件

    <C程序设计语言>(K&R)中文高清非扫描件(带书签目录) 对于某下载东西都要C币的网站无爱了.好不容易找了一个,发出来看会不会帮到别人   附上addr:https://pan. ...

  7. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  8. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  9. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  10. PL真有意思(二):程序设计语言语法

    前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...

随机推荐

  1. 安装PHP拓展

    win环境下: php扩展下载地址:http://pecl.php.net/ 需要知道:  php版本,操作系统位数,线程是否安全.想要知道这3个,在php中输入.如下图所示:phpinfo();di ...

  2. wails实现腾讯元器bot

    简单记录工具的一个模块 后端 Api调用 登录 腾讯元器 后创建智能体,按自己的需求来创建,发布后要等等审核. ​​ 等发布完成后点击调用api即可,这里可以看到user_id​, assistant ...

  3. SQL Server调用OLE对象

    T-SQL 中是可以调用 OLE 的,将这一功能应用到触发器.存储过程等对象中,SQL Server 运用变得更贴近我们的功能,更加满足我们的需要. T-SQL 中有七个存储过程是围绕本节内容进行的, ...

  4. redis复制replica

    通过查看log信息即可观察主机是否与从机正确连接,一般来说主机上有succeeded就是可以了 可以通过info replication查看自己的身份 role:master connected_sl ...

  5. SpringBoot配置过滤器、拦截器

    拦截器概述 Spring Boot提供了一种简单且强大的方式来定义和使用拦截器(Interceptor).Spring Boot的拦截器基于Spring框架的拦截器机制,可以在请求的处理过程中插入自定 ...

  6. 2、SpringBoot2之入门案例

    2.1.创建Maven工程 2.1.1.创建空项目 2.1.2.设置项目名称和路径 2.1.3.设置项目sdk 2.1.4.项目初始状态 注意:需要关闭项目再重新打开,才能看到SpringBoot-P ...

  7. 【RabbitMQ】05 通配符模式

    需要设定交换机模式为通配符模式 Topic 在绑定规则上采用通配描述实现动态绑定 创建通配符模式的生产者 package cn.dzz.topicQueue; import com.rabbitmq. ...

  8. 【Java-GUI】07 Swing01 入门案例

    Swing是Java自己开发出的一套GUI组件,不同于AWT去调用操作系统的GUI 正是因为非系统平台的GUI,所以程序运行的要慢一些 涉及的设计模式:MVC模式 Model(组件对象状态) View ...

  9. kimchi – kvm虚拟机网页管理

    参考: https://mangolassi.it/topic/15882/kimchi-kvm-updated-and-better-and-easy-guide-for-kvm-beginners ...

  10. 亲测可用的 Linux(Ubuntu18.04下)可运行的超级玛丽奥(gym-super-mario-bros)游戏的仿真环境—————————可用于强化学习算法的游戏模拟器环境

    与前文中的俄罗斯方块游戏一样都是可以用于强化学习算法的游戏模拟器,这里介绍的是超级玛丽奥(gym-super-mario-bros)游戏的仿真环境. Python库,代码地址: https://git ...