数组的下标表示法和指针表示法
# include <stdio.h>
int main() {
char title[] = {"C language pointer!"}; //等价于char title[]="C language pointer!";
char *ptitle;
/*
这段程序很清楚地表达了数组指针变量指向数组的概念。
数组在内存中是一段连续的内存区域,数组名是数组第一个元素的地址,也就是这段连续内存区域的首地址。
当数组指针变量指向数组时,实际上是指向第一个数组元素,也就是这段连续内存区域的首地址。
*/
ptitle = title; //等价于ptitle=&title[0];
printf("title: %s\n", title); //title: C language pointer!
printf("ptitle->title: %s\n", ptitle); //ptitle->title: C language pointer!
printf("&title=%p\n", &title); //&title=0x7fff5fbff790
printf("ptitle=%p\n", ptitle); //ptitle=0x7fff5fbff790
printf("&title[0]=%p\n", &title[0]); //&title[0]=0x7fff5fbff790
//遍历
while (*ptitle) {
printf("%c", *ptitle);
ptitle++;
}
printf("\n");
int a[] = {1,2,3,4,5};
int *p =a;
while (*p) {
printf("%d", *p);
p++;
}
printf("\n");
//另一种遍历
p = a;
for (int i=0; i<sizeof(a)/sizeof(int); i++) {
printf("%d", p[i]); //等价于*(p+i)
}
printf("\n");
return 0;
}
指针数组
/**
* int: 表示该指针数组的元素(即指针变量)指向int类型的数据
* *num: 表示该数组是指针数组,名字为num
* [3]: 数组的长度为3
*/
int *num[3]
/**
* char: 表示该指针数组的元素(即指针变量)指向字符或字符串的首地址
* *name: 表示该数组是指针数组,名字为name
* []: 数组的长度初始化成为了3
*/
char *name[] = {"China", "Beijing", "Haidian"};
//name[0] 指向 "China" 的首地址,同理 name[1],name[2]...
字符串与字符[串]指针变量
- 在编程中,字符串是经常用到的操作对象;
- 字符串的处理方式有两种,一种是数组形式,一种是指针形式;
- 数组形式是吧字符串存放在数组当中,具有数组的属性,数组名代表存放字符串的首地址,可以通过下标或指针的方式访问字符串;
- 指针形式是指通过字符指针指向字符串,以此来访问字符串中的字符,而不用定义数组;
- 无论是数组或指针形式,字符串在内存中都是占用一块连续的内存空间。
# include <stdio.h>
int main() {
char *str = "I love China!"; //str是一个指向char的指针变量,指向该字符串的首字符'I'的地址
printf("%s\n", str); //I love China!
printf("%p\n", str); //0x100000f9e
/*
运行结果:
I 0x100000f92
0x100000f93
l 0x100000f94
o 0x100000f95
v 0x100000f96
e 0x100000f97
0x100000f98
C 0x100000f99
h 0x100000f9a
i 0x100000f9b
n 0x100000f9c
a 0x100000f9d
! 0x100000f9e
*/
char *p = str;
while (*p) {
printf("%c %p\n", *p, p);
p++;
}
printf("\n");
return 0;
}