全文讲解都在注释
一、字符指针
代码讲解:
int main()
{
char ch = 'a';
char* pc = &ch;
//pc是指针变量,存放的是'a'的地址
return 0;
}
int main()
{
const char* p = "hello world";//
这里是把字符串首元素'h'的地址放进p
//因为地址直接放入指针时,"hello world"是常量字符串,不能修改!!!
//const的作用是将确保常量字符串遭到修改时会进行报错
printf("%s\n", p);
//%s打印字符串
return 0;
}
int main()
{
char arr[] = "abcdef";
char* p = arr;//p中存放arr数组的首元素地址
return 0;
}
扩展:
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
//虽然内容相同,但两个数组本质上是两个空间
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
//表面上指向的空间不同,但因为都是h的地址,电脑为了方便处理,并不会取两个不同地址的h
if(str1 ==str2)
printf("str1 and str2 are same\n");
//错
else
printf("str1 and str2 are not same\n");
//对
if(str3 ==str4)
printf("str3 and str4 are same\n");
//对
else
printf("str3 and str4 are not same\n");
//错
return 0;
}
二、数组指针
代码讲解:
int (*pa)[10] = &arr;//&arr是数组的地址,不是数组首元素的地址
//arr代表的是数组首元素的地址
//如果写成int* pa[10] = &arr 会理解成一个十元素的数组,每个元素是整形指针(指针数组)
int (*p)[10];
//p是一个指针变量,指向一个大小为十个整型的数组
//因为[]的优先级要高于*号,所以必须加上()来保证p先和*结合,形成指针
使用讲解:
可用于打印二维数组
void print_arr1(int arr[3][5], int row, int col)
{
int i = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("%d",arr[i][j]);
}
}
}
int main()
{
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10};
print_arr1(arr, 3, 5);
}
三、指针数组
(存放指针的数组)
代码讲解:
int main()
{
char* arr[] = {"abcde","haha","qwer"};
//arr中储存的是分别是a的地址,h的地址,q的地址
int i = 0;
for(i = 0;i < 3;i++)
{
printf("%s",arr[i]);
}
return 0;
}
代码使用:
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] == *(arr + i)
printf("%d",*(arr[i] + j));//两种打印方式意义相同
}
printf("\n");
}
return 0 ;
}