一维数组和一维指针

一维数组和一维指针码龄超过两个星期的可以划走了 新手练习一下写博客 写了一些一维数组的初始化和一维指针的基础知识

1.一维数组

(1)数组的初始化

一维数组是数组里面最基础的部分,也是最简单的。比如要存放数字1到10。那么可以定义应该大小为10的整型数组:

#include 
     #include 
     int main() { 
    int a[10]; //定义数组,但是没有初始化  memset(a,0,10*sizeof(int)); //初始化数组。memset(1.数组名 2.数组元素的初始化值3.给多少个元素初始化,记得*sizeof(数组类型)) //这样就把数组a里面的10个元素初始化为0了。memset函数的头文件是#include 
    for(int i=0;i<10;i++) //给a[0]到a[9]分别赋值1到10  a[i]=i+1; for(int i=0;i<10;i++) //依次输出1,2,3,4,5,6,7,8,9,10  printf("a[%d]=%d\n",i+1,a[i]); return 0; } 

一般来说,数组都需要初始化,初始化的方式有很多种。但是有一种赋值方式是不行的。就是当n是未知量的时候不能写成int a[n],即计算机在可以识别n之前,如果有int a[n];这样的语句是错误的。而一般犯这种错误的都是想当然:既然我开辟数组空间总是要给中括号里面的数赋值,那为什么不直接写一个n,用的时候临时给n赋值呢 :下面这种就是典型的错误写法

#include 
     #include 
     int main() { 
    int n; int a[n]; //报错 scanf("%d",&n); for(int i=0;i<n;i++) a[i]=i+1; for(int i=0;i<n;i++) printf("%d",a[i]); return 0; } 

上面已经说了,在n不可以被编译器识别的时候,int a[n] 这种写法是不行的。就比如,我要拿桶子接水,我要去拿不同大小的桶子,在我准备拿起桶子之前,你必须告诉我要接多少水,不然我怎么知道要拿多大的桶子?相反的,如果你告诉了我要接多少水,我就知道拿多大的桶子了.开辟数组也是,你不提前告诉编译器要开多大的空间,等你开辟完再去说是不是就晚了?所以在编译器没有识别n之前,是开辟不了空间的

#include 
     #include 
     int main() { 
    int n; scanf("%d",&n); int a[n]; //正确,但是vs会报错,devc可以 for(int i=0;i<n;i++) a[i]=i+1; for(int i=0;i<n;i++) printf("%d",a[i]); return 0; } 

那么这样就是可以是正确的,(这是在devc++,c++11标准下可以成功运行,但是用vs运行不了)。但是不推荐这样写,下面会说。

#include 
     int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动将所有元素初始化为0  int main() { 
    for(int i=0;i<10;i++) a[i]=i+1; for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; } 
  1. 使用memset函数,上面写了。
#include 
     //int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动赋值为0  int main() { 
    int a[10]={ 
   0}; //如果需要全部初始化为0,那么就写一个0,后面的自动会补0 for(int i=0;i<10;i++) a[i]=i+1; for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; } 

4.还可以这样写:int a[]={1,2,3,4,5};等价于: int a[5]={1,2,3,4,5}。

(2)数组之间的赋值

新手在刚开始学数组的时候举一反三,心想,int a=5; int b=3;a=b;
那么a=3。嗯,心里感觉悟到了些东西。那么int a[10]={1,2,3,4,5,6,7,8,9,0},int b={0}。b=a;然后用一个for循环输出数组b。然后报错。。这说明数组是不能通过数组名赋值的,下面用代码说明

#include 
     //int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动赋值为0  int main() { 
    int a[10]={ 
   0}; int b[10]={ 
   0}; for(int i=0;i<10;i++) //给a赋值  a[i]=i+1; //b=a;//错误,尝试将数组a直接全部复制给b for(int i=0;i<10;i++) //给b赋值  b[i]=a[i]; //一个一个赋值,正确 for(int i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); for(int i=0;i<10;i++) printf("%d ",b[i]); return 0; } 

2.一维指针

(1)什么是指针

如果在程序中定义一个整型变量a,在对程序进行编译的时候,系统会给a分配内存,int型变量是分配4个字节,而内存中的每一个字节都有一个对应的编号,这个编号就是这个变量的地址。打个比方。这个“地址”(也就是编号)就像房间门牌号,在这个房间号里面的人就是内存存放的数据。假设int a=5; a的地址是1000,那么找到编号为1000的内存地址,这个内存地址存放了一个4个字节的变量,通过计算存放的是5。

在这里插入图片描述
我们将地址形象地称作“指针”,通过地址可以找到单元变量,也就是通过指针可以找到单元变量。

(2)一维指针的基本使用

如果定义了一个int型变量a,要想通过指针指向这个变量;

int a=5; int *p; //定义一个指向整型变量的指针 p=&a; //把a的地址,也就是&a给p printf("%d",*p); //输出5,p是a的地址,那么*p自然就不是地址,而是这个地址存放的内容 printf("%d",a); //输出5 

值得一提的是,相同类型的指针只能和相同类型的变量配套使用

char a='s'; int *p; p=&a; //这是错误的,因为p是int*型的,而&a是char*型的。 //a是char型的,那么&a就是char*型的.p是int*型的,那么*p就是int型的,自己慢慢体会一下这种变换。 

既然指针指向了变量,那么可以通过指针改变变量的值吗?

#include 
     int main() { 
    int a=5; int *p; p=&a; printf("*p=%d\n",*p); *p=3; printf("*p=%d\n",*p); printf("a=%d",a); return 0; } 

输出是5,3,3.发现是可以改变的。这说明这个时候a和*p已经是等价关系了

后言

这是小刘第一篇博客,试试这个文本编译器怎么写(还是不熟练),写的不是很好,滥竽充数写一点基础知识,讲的不是很深入,建议参考为主。以后会定期更新一些博客的个人见解,一起加油!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203423.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:50
下一篇 2026年3月19日 下午9:50


相关推荐

  • pytcharm2021激活码(最新序列号破解)

    pytcharm2021激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    93
  • matlab 计算变异系数,变异系数法求权重matlab 代码[通俗易懂]

    matlab 计算变异系数,变异系数法求权重matlab 代码[通俗易懂]利用matlab编程,很容易根据变异系数法,求得多指标综合评价模型的权重。代码如果有不懂的地方,可以联系我。变异系数法求权重matlab代码clear;clc;[data1,header1]=xlsread(‘statistic1.xlsx’,’ECO’);%必须将statistic.xlsx至于默认文件下,或者给出完整路径[data2,header2]=xlsread(‘stati…

    2022年6月11日
    62
  • linux服务器杀进程,linux杀死进程命令[通俗易懂]

    进程ID注:信号代码可以省略;我们常用的信号代码是-9,表示强制终止;举例:[root@localhost~]#psauxf|grephttpdroot49390.00.05160708pts/3S+13:100:00\_grephttpdroot48300.11.32423210272?Ss13:020:00/usr/sbin/httpd…

    2022年4月16日
    167
  • 关于FIONREAD命令的作用[通俗易懂]

    关于FIONREAD命令的作用[通俗易懂]当在ioctl里使用FIONREAD时,除了获得所指定的读缓存大小以外,还有清除设备准备就绪状态的作用.代码CodehighlightingproducedbyActiproCodeHig

    2022年7月3日
    59
  • 电阻和电容的识别_电容电阻怎么区分

    电阻和电容的识别_电容电阻怎么区分一、贴片电阻阻值的读法贴片电阻的阻值通常以数字形式直接标注在电阻的表面,所以读电阻的阻值直接看电阻表面的数字即可。通常情况下有三种表示方法:(1)、由三个数字组成,表明电阻的误差是±5%。前面两位是有效数字,第三位数字表示乘零的倍数,即10的几次方,基本单位是Ω。例如:103,1和0是有效数字直接写下来即可,3表示乘零倍率,也就是10的2次方,所以103表示的阻值就是1010^3=1010…

    2022年8月21日
    8
  • Java8中Collectors详解

    Java8中Collectors详解文章目录 1 averagingDou collectingAn counting4 groupingBy4 1groupingBy Function 4 2groupingBy Function Collector 4 3groupingBy Function Supplier Collector 5 groupingByCo 1groupingByC

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号