03 C Pointer&Array
指针和数组
指针访问一维数组
- 通过数组名和下标访问
scanf("%d", &a[i]);
printf("%d", a[i]);
- 通过数组名和解引用访问
scanf("%d", a+i);
printf("%d", *(a+i));
- 通过指针变量和下标访问
int *p; p = a;
scanf("%d", &p[i]);
printf("%d", p[i]);
- 通过指针变量和解引用访问
int *p;
for (p = a; p < (a + 10); p++)
{
scanf("%d", p);
printf("%d", *p);
}
//for(p=a+10;a<p;a++) 错误
指针访问二维数组
- 行指针,类型为数组指针
int (*)[]
行指针每加一,指向后一行
a+i代表第i行首地址
- 列指针,类型为整型指针
int *
列指针每加一,指向后一列
a[i]和*(a+i)代表a[i][0]地址
a[i]+j和*(a+i)+j代表a[i][j]地址
- 数组元素,类型为整型
a[i][j]和*(a[i]+j)和*(*(a+i)+j)代表元素a[i][j]
- 指针变量可以指向二维数组元素
二维数组的元素在内存中按行顺序存放,可用一个指针变量依次遍历
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for (p = a[0]; p < a[0] + 12; p++)
{
printf("%4d", *p);
if ((p - a[0] + 1) % 4 == 0) printf("\n");
}
- 数组指针变量可以指向数组中的一行
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (*p)[4], i, j;
p = a;
printf("enter row and colum:");
scanf("%d,%d", &i, &j);
printf("a[%d][%d] = %d\n",i,j,*(*(p + i) + j));
- 二维数组行地址作为函数参数
int maxVal(int (*array)[4], int m) {
int i, j, max = array[0][0];
for (i = 0; i < m; i++)
for (j = 0; j < 4; j++)
if (array[i][j] > max)
max = array[i][j];
return max;
}
字符数组
- 字符串可以存放在一个字符数组中,例如:
char a[] = "string"
也可以存放在一个字符串常量中,例如:const char *s = "string"
字符串常量不能更改 例如:char *b = "china"; b[4] = 'e';//wrong
- 用指针变量访问字符串常量
const char* a = "i love china!";
//不能改为 char a[]="i love china!";
a = a + 7;
printf("%s\n", a);
- 用指针变量访问不同字符串常量
const char* string = "i love china!";
printf("%s\n", string);
string = "i am a student.";
printf("%s\n", string);
- 字符串复制
void str_cpy(char* dest, const char* src)
{
int i = 0;
while (src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
void str_cpy(char* dest, const char* src) {
for (; *src != '\0'; src++, dest++)
*dest = *src;
*dest = '\0’;
}
- 字符串连接
void str_cat(char* dest, const char* src)
{
int i, j;
for (i = 0; dest[i] != '\0'; i++)
;
for (j = 0; src[j] != '\0'; i++, j++)
dest[i] = src[j];
dest[i] = '\0';
}
指针数组
- 指针数组:元素是指针类型的数组
#include <stdio.h>
#include <string.h>
void sort(char* name[], int n);
void print(char* name[], int n);
int main() {
char* name[]={"write","computer","program","compile"};
sort(name, 4);
print(name, 4);
return 0;
}
void print(char** name, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%s\n", name[i]);
}
void sort(char** name, int n) {
char* temp; int i, j, k;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (strcmp(name[k], name[j]) > 0) k = j;
if (k != i) {
temp = name[i]; name[i] = name[k];
name[k] = temp;
}
}
}
小技巧
- 形参数组可再被赋值
void f(int a[100], int n)
{
printf("first element is %d,", *a);
a = a + n - 1;//形参数组可以被再赋值
printf("last element is %d\n", *a);
}
- 利用指针输入字符串到一个数组
char str[10];
char *a;
a = str;
scanf("%s", a);
- 数组指针与指针数组
-
数组指针:指向数组的指针
int (*p)[5]; -
指针数组:元素为指针的数组
int * p[5];

浙公网安备 33010602011771号