数组名表示的是这个数组的首地址。即如果有int a[10],则a 相当于&a[0]。

#include <stdio.h>
main() {
int a[5]= {1,3,5,7,9};
printf("数组a[]的地址为:%d\n",a); for(int i=0; i<10; i++) {
printf("a[%d]的地址为:%d \n",i, &a[i]);
}
}

运行结果:

数组a[]的地址为:6487600
a[0]的地址为:6487600
a[1]的地址为:6487604
a[2]的地址为:6487608
a[3]的地址为:6487612
a[4]的地址为:6487616
a[5]的地址为:6487620
a[6]的地址为:6487624
a[7]的地址为:6487628
a[8]的地址为:6487632
a[9]的地址为:6487636

指针操作数组元素

#include <stdio.h>
main() {
int a[]= {1,3,5,7,9};
int *p = NULL; p = a;
printf("数组名赋值给指针:%d\n", *p); p = &a[0];
printf("指针指向数组首元素:%d\n", *p); p = &a[2];
printf("针指向数组任意元素:%d\n", *p); // 指针加上整数,相当于数组下标加上整数
// p+j = a[i+j]
printf("指针加上整数:%d\n", *(p+1));// a[2+1]
}

运行结果:

数组名赋值给指针:1
指针指向数组首元素:1
针指向数组任意元素:5
指针加上整数:7

指针遍历数组

#include <stdio.h>
main() {
int a[5]= {1,3,5,7,9};
int nLen = sizeof(a)/sizeof(int);
int *p=a;
int *q;
q=p; for(p; p-q<nLen; p++) {
printf("%d ",*p);
}
}

函数封装版:

#include <stdio.h>

void printArray(int *p,int len) {
int *q = p;
for(p; p-q<len; p++) {
printf("%d ",*p);
} printf("\n");
} main() {
int a[5]= {1,3,5,7,9};
printArray(a, 5);
}

指针版求字符串长度

#include <stdio.h>
#include <string.h>
int myStrlen(char *s) {
int n = 0;
while(*s !='\0') {
n++;
s++;
}
return n;
} main() {
char str1[200];
strcpy(str1,"大话西游2");
printf("%d\n", myStrlen(str1));
printf("%s", (str1));
}

指针版字符串常量

“指针版”字符串常量可像数组一样输出,不能修改,但可以直接赋值。

#include <stdio.h>
main() {
char astr[] = "hello world";// 普通字符串常量(即字符数组)
char *pstr = "hello world";// 指针版字符串常量 // “指针版”可像数组一样输出
printf("%c %c", astr[0], pstr[0]); //X:“指针版”不能修改:pstr[0] = 'c';
astr[0] = 'c'; printf("\n %s\n", pstr);
printf("\n %s\n", astr); //X:字符数组不能直接赋值:astr = "wellcome c";
pstr = "wellcome to c";// “指针版”可以直接赋值
printf("\n %s\n", pstr);
}

指针版字符串复制

#include <stdio.h>
void copy_str(char *strFrom , char *strTo) {
while(*strFrom != '\0') {
*strTo = *strFrom;
strTo ++;
strFrom ++;
}
*strTo = '\0';
} main() {
char* strFrom = "一生事业总成空,\
半世功名在梦中。\
死后不愁无勇将,\
忠魂依旧守辽东。";
char strTo[200] = {0};
copy_str(strFrom, strTo);
puts(strTo);
}

字符串转置

#include <stdio.h>
#include <string.h>
main() {
char str[] = "pool";
char *p1 = str;
char *p2 = str + strlen(str) - 1; char temp ;
while (p1 < p2) {
temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
puts(str);
}

指针数组

指针的数组。

#include <stdio.h>
main() {
char* pName[] = {"1.关胜","2.林冲","3.秦明","4.呼延灼","5.董平"};
printf("指针长度:%d \n", sizeof(char*));
printf("指针数组长度:%d \n", sizeof(pName)); int i;
for( i= 0; i<5; i++) {
puts(pName[i]);
}
puts("---------------");
char* temp = pName[0];
pName[0] = pName[4]; // 改变指向
for( i= 0; i<5; i++) {
puts(pName[i]);
}
printf("temp = %s", temp);
}

运行结果:

指针长度:8
指针数组长度:40
1.关胜
2.林冲
3.秦明
4.呼延灼
5.董平
---------------
5.董平
2.林冲
3.秦明
4.呼延灼
5.董平
temp = 1.关胜

C语言讲义——数组和指针的更多相关文章

  1. C语言中数组与指针的异同之处!你不知道的编程奥秘~

    C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数 ...

  2. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  3. [C语言基础] 数组与指针之间的引用

    通过指针引用数组,通过数组引用指针,你搞明白了么?通过下面3种情形来了解一下数组和指针 Case 1. unsigned char arry[10]; unsigned char *ptr; unsi ...

  4. c语言,数组和指针

    概要: 1.普通数组与指针 2.数组指针 3.指针的数组 数组是一个由(同一类型)连续元素组成的预先分配的内存块:指针是一个对任何位置的元素的引用. 数组自动分配空间,但不能重分配或改变大小:指针必须 ...

  5. 由strcat函数引发的C语言中数组和指针问题的思考

    问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...

  6. c语言中数组,指针数组,数组指针,二维数组指针

    1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...

  7. c语言字符数组和指针的经典用法

    1.字符数组 许多情况下,对字符串的处理使用字符数组会更加方便,比如: 我觉得不改变字符串的原有顺序,对字符串进行删除等操作时,使用字符数组效果会更好. eg:给定字符串(ASCII码0-255)数组 ...

  8. (四)C语言柔性数组、指针赋值

    一.柔性数组 今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧. #include<stdio.h> #include<string.h> # ...

  9. C语言讲义——数组

    数组是: 一组数据 一组类型相同的数据 在计算机底层,数组是一块连续的内存 为什么使用数组? 一年12个月 int m1=1, m2=2, m3=3, ... 麻烦 数组示例: #include &l ...

随机推荐

  1. vue-cli axios ie9 问题

    vue在ie9中碰到的问题 最近我们的项目选择用vue来做开发,在这个过程我们还要兼容ie9这个坑,在这里我写一点我碰到的坑 开发选用:vue+vue-cli+axios+router+iview+m ...

  2. Filebeat 根据不同的日志设置不同的索引

    平时在物理机上使用 Filebeat 收集日志时,会编写多个 filebeat 配置文件然后启动多个 filebeat 进程来收集不同路径下的日志并设置相对应的索引.那么如果将所有的日志路径都写到一个 ...

  3. oracle基本学习

    oracle目录及卸载 1.oracle的目录介绍: oradata:数据库存储文件的目录 db_home: network >admin:配置网络服务和监听器服务 jdk:oracle自带jd ...

  4. 任务管理器中arcsom.exe和arcsoc.exe的个数问题

    转载链接:http://blog.newnaw.com/?p=78 安装了ArcGIS Server的机器,当打开任务管理器的时候,会看到里面有arcsom.exe和arcsoc.exe进程,但它们的 ...

  5. rs485通讯模块有什么作用

    rs485通讯模块是什么 rs485通讯模块我们可以分为几个部分来理解,rs485简单来说就是一个硬件,是一个物理接口.而这个接口要进行数据传输通讯,就需要采用网络协议和远端的服务器或者是其它网络设备 ...

  6. 机器学习 第5篇:knn回归

    基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数 ...

  7. Netcore中简单使用MemoryCache

    用到缓存架构,我们一般都会想到的Redis,因为它支持分布式,高可用,速率非常快.MemoryCache则相对较少提到,但是对于单体项目或者小型项目,memorycache还是是不错的选择.Memor ...

  8. C/C++模运算(正负整数)

    模运算 模运算:又称为取余运算 正整数的模运算 对于正整数a,b 如果\(a=q\times b+r\)其中\(0\le r < b\) 则有\(a \bmod b=r\)即 \(a\%b=r\ ...

  9. ORA-00020: maximum number of processes (40) exceeded模拟会话连接数满

    问题描述:在正式生产环境中,有的库建的process和session连接数目设置的较小,导致后期满了无法连接.因为正式库无法进行停库修改,只能释放连接,做个测试模拟 1. 修改现有最大会话与进程连接数 ...

  10. 《<SPRING5高级编程(第5版)>_王净译》笔记-【目录】

    第一次写这玩意,不知道什么时候能写完,今天项目比较近,期望年底能看完吧. 先定个小目标 20201228 完成 第1章 Spring介绍 第2章 入门 第3章 在Spring中引入IoC和DI 第4章 ...