1.字符指针
1.1.字符指针
int main()
{
//1
char ch='w';
char* p=&ch;
//2
char* p="abcdef";
*p='w'; //该语句错误
//3
const char* p="abcdef";
return 0;
}
注:
1.代码1是建立变量ch,ch变量空间里面存放字符'w';定义指针变量里面存放变量ch的地址,使指针变量p可以指向变量ch的空间
2.代码2的语句1是将字符串"abcdef"存储在内存的只读数据区(只读数据区里面的数据只能读取),然后将这个字符串的地址(起始地址)放在指针变量p中。
代码2的语句2是不能实现的,因为"abcdef"存在了只读数据区,无法进行更改(强行运行,程序会卡死)
3.代码3是代码2语句1的规范形式。因为代码2不能对只读数据区内的数据进行更改,也就是不能对指针变量p进行解引用,因此在前面用const修饰代码更加严谨。(有些编译器不加const是会报警告的)
1.2.练习
练习一:
#include<stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
const char* str1 = "abcdef";
const char* str2 = "abcdef";
if (arr1 == arr2)
printf("arr1==arr2\n");
else
printf("arr1!=arr2\n");
if (str1 == str2)
printf("str1==str2\n");
else
printf("str1!=str2\n");
return 0;
}
运行结果:
注:
1.arr1和arr2是两个不同的数组,数组名代表数组首元素的地址,因此arr1不等于arr2
2.只读数据区内,相同的数据只存一份,所以,上面代码的str1和str2均指向只读数据区内字符串"abcdef"的地址(首地址)
练习二:
typedef int* pint;
#define PINT int*
int main()
{
//1
int a,b;
//2
int * pa,pb;
//3
int * pa, * pb;
//4
pint pa,pb;
//5
PINT pa,pb;
return 0;
}
注:
1.代码1中:变量a和b都是int类型
2.代码2中:变量pa是int*类型,是指针变量;变量pb是int类型
3.代码3中:变量pa和pb都是int*类型,是指针变量
4.代码4中:变量pa和pb都是int*类型,是指针变量
5.代码5中:代码运行的时候会将PINT换成int*,因此结果和代码2相同。
变量pa是int*类型,是指针变量;变量pb是int类型
2.指针数组
2.1.指针数组
2.2.例子
例1:
#include<stdio.h>
int main()
{
char* arr[] = { "abcdef", "qwer", "zhangsan" };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
运行结果:
注:
该数组在内存中是如下图存储的 :
例2:
#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* arr[] = {arr1, arr2, arr3};
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);//*(*(arr+i)+j)
}
printf("\n");
}
return 0;
}
运行结果:
注:
1.该数组在内存中是如下图存储的 :
2.代码中:arr[ i ][ j ]) 和 *(*(arr+i)+j)是一样的