字符指针
int main()
{
char ch = 'q';
char* pa = &ch;
return 0;
}
不仅可以这样写还可以指向一个字符串
int main()
{
/*char ch = 'q';
char* pa = &ch;*/
char* ph = "hello world";
printf("%c\n", *ph);//打印遇到\0才会结束,没数据会打印随机值
//这个实际上是取的首字符地址存储在ph
char arr[] = "hello world";
//跟数组不同 数组确实放的是整个字符
printf("%s\n", ph);//%s打印字符串.打印遇到\0才会结束,没数据会打印随机值.只需要起始字符 可以打印出所有
printf("%s\n",arr );
return 0;
}
数组名表示首元素地址啊 第一个肯定表示的是两个数组首元素地址是否相同
2个数组在2个不同空间,数组名代表首元素的地址,位置不同,地址就不一样
内存里两块不同的孔吉纳 所以不能更改
arr3 arr3都不能改 所以在内存中共用一份 以下解答
int main()
{
char* ph = "hello world";//“hello world”常量字符串
char arr[] = "hello world";
*ph = 'w';//代码报错 不能更改 因为是常量
arr[0] = 'w';
return 0;
}
指针数组 (指针数组是存放地址的数组)
int main()
{
//指针数组
//数组-数组中存放的是指针
/*int* arr[3];*///存放整形指针的数组
//用途如下
int a[5] = { 1,2,3,4,5 };
int b[] = { 2,3,4,5,6 };
int c[] = { 3,4,5,6,7 };
int* arr[3]={a,b,c};
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
//printf("%d ", *(arr[i] + j));
printf("%d ", arr[i][j]);//同上
}
printf("\n");
}
return 0;
}//i行j列。其实相当于i 一共有三行,i是每一行首元素地址j
数组指针
数组指针 是指向数组的指针
整形指针 是指向整形的指针
字符指针 是指向字符的指针
int main()
{
int a = 10;
int* pa = &a;
char ch = 'w';
char* pc = &ch;
int arr[10] = { 1,2,3,4,5 };
int(*parr)[10] = &arr;//取出的是数组的地址
//parr 就是一个数组指针 -其中存放的是数组地址
double* d[5];
double* (*pd)[5] = &d;
//arr数组名就是数组首元素的地址 arr[0]地址
return 0;
}
数组名和&数组名
int main()
{
int arr[10] = { 0 };
int* p1 = arr;//整形指针+1跳过4个字节
int(*p2)[10] = &arr;//数组指针 加一 跳过1个数组 m每个数组是整形10个元素
printf("%p\n", p1);
printf("%p\n", p1+1);
printf("%p\n", p2);//打印结果一样 但是类型不同 意义不同。 &arr存起来需要数组指针
printf("%p\n", p2+1);
//两个地址都加1 一个到下一个元素 另一个跳过整个数组
//+4和 + 40,这里加的是字节数。0x28是40,不要只是看表面上的数
return 0;
}
数组
数组名是数组首元素的地址
但是有两个例外:
1.sizeof(数组名)-数组名表示整个数组,计算的整个数组大小,单位是字节。
2&数组名-数组名表示整个数组 取出的是整个数组的地址
数组指针的使用
以上通常不会用到, 接下来写另一种方法
void print1(int arr[3][5], int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
}
void print2(int(*p)[5], int r, int c)//r行 c列
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d", *( * (p + i) + j));//*(*(p+i)+j)就是某一行某一个元素
}
printf("\n");
}
}//p + i是第 i 行的意思p + i直接跳行 *找到某一行数组名
int main()
{
int arr[3][5] = { {1,2,3,4,5 },{ 2, 3, 4, 5, 6},{ 3, 4, 5, 6, 7} };
print1(arr, 3, 5);
print2(arr, 3, 5);//arr数组名表示数组首元素地址 二维数组首元素是第一行。int a[5]相当于这样。&a
//第一行的地址是一个数组指针
return 0;
}
回顾下以下代码
parr3是一个存放数组指针的数组,可以存放10个指针每个指针指向一个数组 数组是5元素的数组 每个元素是int
parr3[]是一个数组 每个元素是个数组指针
就是一个数组指针指向五个数组元素
数组参数和指针参数
第三个 int的地址整形的地址放到整形里,所以这题没问题。 这里有点坑,只要把arr当成一个普通的变量就行了,比如你传一个数组,你可以定义一个指针去接收,这个arr就是那个指针
test2数组传参写成数组所以没问题
test22
第4 拿那这个只能传过去二维数组的第一行
第5 不能用存放整形指针的数组接收
最后一个 要传的不是指针,所以二级指针不对