文章目錄
- 前言
- 一、指針和數組
- 二、指針和二維數組
- **行指針(數組指針)**
- 三、 字符指針和字符串
- 四、指針數組
前言
一個學習嵌入式的小白~ 有問題評論區或私信指出~
提示:以下是本篇文章正文內容,下面案例可供參考
一、指針和數組
- 在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) (對)
題目:數組反序存放
#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語言中 ,二維數組的元素連續存儲,按行優先存
題目:一級指針遍歷二維數組
#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 };
- 例如:
int a[2][3] ; int (*p)[3];
方括號中的常量表達式表示指針加1,移動幾個數據。
當用行指針操作二維數組時,表達式一般寫成1行的元素個數,即列數。
題目:使用行指針表示二維數組的某個元素
#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數據類型的指針變量稱為字符指針變量。字符指針變量與字符有著
密切關系,他也被用來處理字符串。 - 初始化字符指針是把內存中字符串的首地址賦予指針,并不是把該字符串復制到指針
中。
char str[] = "Hello World";char *p = str;
- 在C語言編程中,當一個字符指針指向一個字符串常量時,不能修改指針指向的對象
的值
char *p = "Hello World"; *p = 'h';
題目:不使用任何字符串函數,實現字符串函數連接功能
#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;
}
四、指針數組
所謂指針數組是指由若干個具有相同存儲類型和數據類型的指針變量構成的集合
指針數組的一般說明形式:
- <存儲類型 > <數據類型> *<指針數組名> [<大小>]
- 指針數組名表示該指針數組的起始地址
聲明一個指針數組
double *pa2[2] , a[2][3];
把一維數組a[0] 和 a[1]的首地址分別賦予指針變量數組的數組元數pa[0] 和pa[1];
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]的第一個元素。
題目:使用指針數組處理二維數組,求出二維數組所有元素的和。
#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;
}