数组与指针

数组

什么是数组:

数组是用来存储多条相同数据类型数据的数据结构。(容器)

    数组是存储多个统一数据类型变量的容器,数组中每一个数据叫元素,数组由多个元素组成。

    数据下标来区分数据中的元素。元素从数组的位置0开始。

    元素可以使用数组变量名[下标]来得到具体的元素

    数组中元素的个数叫数组的长度

    数组所占的空间=元素的类型*数组的长度

    数组名指向的区域,是数组在内存中的首地址


数组的语法格式:

 
 
  1. // 定义数组:元素类型 数组名[元素个数];

  2. int array[3];

  3. // 访问元素:数组名[下标]

  4. array[0] = 10;


数组下标

下标是指访问数组元素时,中括号中的数字

下标不能越界,如果越界,可能会导致以下后果:

    程序直接崩溃

    莫明的该变来其他变量或数据空间的值

    什么事儿都没有


数组的初始化

初始化

    赋使用的值

 
 
  1. int array1[3] = {3,4,5}; // 依次给数组元素赋值

  2. int array2[3] = {1,2}; // 如果赋值的个数少于数组的长度,会自动用0来填充后面的值

    赋零值

 
 
  1. int array3[3]; // 未初始化,可能存在垃圾值

  2. int array4[3] = {0}; // 数组中每个元素是0


数组名和数组首地址

数组名是一个地址,而且是不可变的地址

数组名不可以作为左值,就是不能出现在赋值语句的左边。初始化除外。

数组名是常量(指针)。所以不能赋值。


数组的赋值和拷贝

数组的赋值

 
 
  1. int array[10];

  2. array[2] = 10; // 将数组的第三个元素赋值未10

数组的拷贝

 
 
  1. int array[10] = {1,2,3,4,5,6,7,8,9,0};

  2. int num[10];

  3. for (int i = 0; i < 10; i++)

  4.    num[i] = array[i];


数组的遍历

数组的正向遍历

 
 
  1. int array[10] = {1,2,3,4,5,6,7,8,9,0};

  2. for (int i = 0; i < 10; i++)

  3.    printf("%d ", array[i]);

数组的反向遍历

 
 
  1. for (int i = 9; i>=0; i--)

  2.    printf("%d ", array[i]);


随机数

rand()函数用于生成一个随即数

srand()函数用于定义随机种子

  
  
  1. int main()
  2. {
  3.    srand((unsigned)time(0));
  4.    for (int i = 0; i < 10; i++){
  5.        int x = rand()%100;
  6.        printf("%d ",x);
  7.    }
  8.    printf("\n");
  9.    return 0;
  10. }

二维数组


数组的数组

定义数组:元素类型 数组名[元素个数][元素个数]

  
  
  1. int array[3][4];
访问元素:数组名[下标][下标];
  
  
  1. array[1][2] = 10;

二维数组的初始化

二维数组的初始化

对应元素内容

  
  
  1. int array[3][2] = {{1,2},{3,4},{5,6}};

整体赋值

  
  
  1. int array[3][2] = {1,2,3,4,5,6};

依次赋值 自动补零

  
  
  1. int array[3][2] = {1,2,3,4}


二维数组的数组名

二维数组名同样是一个地址,而且是不可变的地址。

二维数组名同样不可以作为左值,就是不能出现在赋值语句的左边。初始化除外。

二维数组名是常量(指针)。所以不能赋值。



指针

什么是指针

内存被分为字节,每个字节有唯一的地址,指针指的就是内存地址。

保存指针的变量,就叫指针变量。(保存地址)

声明一个指针变量

  
  
  1. int i = 0;
  2. int * p; // 声明一个指针变量 int * 指针类型

每个指针变量能指向一种特定类型的对象(地址,内存区域)。

指针是引用数据类型,因为本身没有保存数据,只是保存了数据的地址,间接的找到内存中的数据。

  
  
  1. // 值传递
  2. void swap1(int a, int b){
  3.    int temp = a;
  4.    a = b;
  5.    b = temp;
  6. }
  7. // 地址传递
  8. void swap2(int *a, int *b){
  9.    int temp = *a;
  10.    *a = *b;
  11.    *b = temp;
  12. }
  13. int main(){
  14.    int a = 5, b = 8;
  15.    swap1(a,b);
  16.    printf("%d %d", a, b);
  17.  
  18.    swap2(&a, &b);
  19.    printf("%d %d", a, b);
  20. }

指针用于返回值

  指针也可以作为返回值

  不要返回自动变量的地址,因为局部变量的生命周期仅在函数内部,当函数结束,局部变量会被自动清除(释放)。解决方法:延长生命周期。



指针加、减操作

指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。

    int类型指针+1 = 地址+4

    char类型指针+1 = 地址+1



指针与数组区别


占用内存空间

    数组占用空间 = 数组元素占用的空间*长度

    指针占用空间 = 在64位系统下,8个字节,固定的,一直在的类型没关系。


赋值

    数组名是常量,是不可以修改其值

    指针是变量,可以多吃赋值

    对指针的赋值,本质上是指针指向的改变


字符串

什么是字符串

用双引号引起来的多个字符,以‘\0’结尾

“I am a string.\n”

"a string""other string" ==>"a string other string";

"a string \

string" ==> "a string string";

 

字符串与普通字符数组的区别

字符数组

    是字符类型的数组

    每个数组元素保存一个字符

字符串

    是字符指针变量

    指向字符串中第一个字符的地址


字符串的定义方式

字面值“Hello”

  
  
  1. printf("Hello");

使用字符数组来定义字符串

  
  
  1. char str[10] = {'H','e','l','l','o','\0'};

使用字符指针

  
  
  1. char * str2 = str;


字符串的使用

声明的变量,放在内存中的栈区。

字面值方式创建的字符串,放在内存中的代码区,如果创建的是字符串,并且值是相同的,只会创建一个内存区域,其值是只读的,值不可以改变。

使用数组方式创建的字符串,放在内存中的栈区,可以创建多个相同的字符串,其值可以改变。

字符指针,只是指向了内存的一个区域。



希望持续关注,如有疑问请回复!谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值