C语言学习记录(十二)——指针与数组及字符串

文章目录


前言

一个学习嵌入式的小白~ 有问题评论区或私信指出~


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针和数组

  • 在C语言中 ,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元
    素在内存中的起始地址。
  • 一维数组的数组名为一维数组的指针(起始地址)

例如:

c 复制代码
		double x[8]; //x为数组的起始地址
		double *p;
		p = x;
		

设指针变量px的地址值等于数组指针x(即指针变量px指向数组的首元素),则:

x[i] 、 (px+i)、(x+i) 和px[i]具有完全相同的功能:访问数组的第i+1个数组元素

int a[10], *p ; p=a;

p[i] <==> *(p+i)

  • 注意:
    • 指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为
      指针变量和数组名都是地址量
    • 但指针变量和数组的指针(或叫数组名)在本质上不同,指针变量是地址变量,而数
      组的指针是地址常量

数组名是地址常量

p++ ,p-- (对)

a++, a-- (错)

a+1 ,*(a+2) (对)
题目:数组反序存放

c 复制代码
#include <stdio.h>

void swap(int *p1,int *p2);//交换函数
void swaparr(int arr[],int lenth);//数组为形参
void swapprr(int *arr,int lenth);//指针为形参

int main()
{
	int arr[10];
	for(int i = 0;i<10;i++)//循环输入数组中的元素
	{
		scanf("%d",&arr[i]);
	}
	
	swapprr(arr,10);//进行数组反序
	
	for(int i = 0;i<10;i++)//遍历反序之后的数组
	{
		printf("%d ",arr[i]);
	}
	return 0;
	}
void swap(int *p1,int *p2)//交换函数
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
void swaparr(int arr[],int lenth)反序函数
{
	for(int i=0;i<=((lenth-1)/2);i++){
		swap(&arr[i],&arr[lenth-1-i]);
	}
}	 

void swapprr(int *arr,int lenth)
{
	for(int i=0;i<=((lenth-1)/2);i++){
		swap((arr+i),(arr+lenth-1-i));
	}
}

二、指针和二维数组

多维数组就是具有两个或两个以上下标的数组

在C语言中 ,二维数组的元素连续存储,按行优先存

题目:一级指针遍历二维数组

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int *p,i;
    p = arr;
    for(i = 0;i < 9;i++)
    {
        printf("%d ",*(p+i));
    }
    return 0;

}

可以把二维数组看作由多个一维数组组成。

比如ina a[3][3] ,含有三个元素,a[0],a[1],a[2]

元素a[0],a[1],a[2]都是一维数组名

二维数组名代表数组的起始地址,数组名加1,是移动一行元素。因此,二维数组名常被

称为行地址。

行指针(数组指针)

存储行地址的指针变量,叫做行指针变量,形式如下:

  • <存储类型> <数据类型> (*<指针变量名>){ 表达式n };
  • 例如:
c 复制代码
		int  a[2][3] ;   int (*p)[3];

方括号中的常量表达式表示指针加1,移动几个数据。

当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数。

题目:使用行指针表示二维数组的某个元素

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int (*p)[3],i,j;
    p = arr;
    for(i = 0;i < 3;i++)
        for(j = 0;j < 3;j++)
            printf("%d ",*(*(p+i)+j));

    return 0;

}

三、 字符指针和字符串

  • C语言通过使用字符数组来处理字符串
  • 通常,我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符有着
    密切关系,他也被用来处理字符串。
  • 初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针
    中。
c 复制代码
	char  str[] = "Hello World";
	char *p  = str;
  • 在C语言编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象
    的值
c 复制代码
	char *p = "Hello World";  
	*p  = 'h';

题目:不使用任何字符串函数,实现字符串函数连接功能

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int Mystrlen(char *p);
int main()
{
    char a[100],b[100],c[100];
    char *p;
    p = c;
    int l1,l2;
    printf("please input first string:");
    gets(a);
    printf("please input conented string:");
    gets(b);
    l1 = Mystrlen(a);
    l2 = Mystrlen(b);
    for(int i = 0 ; i<(l1+l2) ; i++)
    {
        if(i < l1)
        {
            p[i] = a[i];
        }
        else
        {
            p[i] = b[i-l1];
        }
        if( i == (l1+l2-1))
        {
            p[i+1] = '\0';
        }
    }
    printf("%s\n",c);
    return 0;
}
int Mystrlen(char *p)
{
    int n = 0;
    for(int i = 0 ; i < 100 ; i++)
    {
        if(p[i] != '\0')
        {
            n++;
        }
        else
        {
            return n;
        }
    }
    return n;
}

四、指针数组

所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合

指针数组的一般说明形式:

  • <存储类型 > <数据类型> *<指针数组名> [<大小>]
  • 指针数组名表示该指针数组的起始地址
    声明一个指针数组
c 复制代码
double *pa2[2] , a[2][3];

把一维数组a[0] 和 a[1]的首地址分别赋予指针变量数组的数组元数pa[0] 和pa[1];

c 复制代码
pa[0] = a[0]; //等价于pa[0] = &a[0][0]
pa[1] = a[1]; //等价于pa[1] = &a[1][0]

此时pa[0]指向了一维数组a[0]的第一个元素,而pa[1]指向了一维数组a[1]的第一个元素。

题目:使用指针数组处理二维数组,求出二维数组所有元素的和。

c 复制代码
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int *pa[3];
    int i,j,sum = 0;
    for(i = 0;i < 3;i++)
    {
        pa[i] = arr[i];
    }
    for(i = 0;i < 3;i++)
        for(j = 0;j < 3;j++)
            sum += *(pa[i]+j);
    printf("%d",sum);
    return 0;
}
相关推荐
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
@小博的博客3 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
DARLING Zero two♡5 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
Ni-Guvara5 小时前
函数对象笔记
c++·算法