1.指针就是个变量,用来存放地址
2.指针的大小是固定的4/8个字节(32位平台/64位平台)
3.指针是有类型的,指针的类型决定了指针的+-整数的步长,指针解引用操作时候的权限
字符指针:
常见的使用方法
int main()
{
char ch = 'q';
char* ps = &ch;
return 0;
}
另一种使用方法
#include<stdio.h>
int main()
{
char* ps = "hello bit";
printf("%c\n",*ps);
return 0;
}
这里的输出结果为h,本质上是把字符串“hello bit”的首字符的地址存储到ps中
例题:
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello,bit.";
char* str3 = "hello bit.";
char* str4 = "hello bit.";
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;
}
可以看出1 2 不同 ,3 4 相同
因为str1 和str2为分别创建了两个数组,有独立的空间,首字符的地址不相同,所以 1 2 不同
因为*str3 和*str4都指向了常量字符串(常量字符串不变),所以地址相同,3 4 相同
指针数组:
指针数组是一个存放指针的数组
int main()
{
//指针数组
//数组-数组中存放的是指针(地址)
int* arr[3];
return 0;
}
这里的数组是一个存放整形指针的数组
int main()
{
int a[5] = { 1,2,3,4,5 };
int b[] = { 3,4,5,6,7 };
int c[] = { 2,3,4,5,6 };
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));//这里表示a每一行下标为j的元素
}
printf("\n");
}
return 0;
}
注意:当中的*(arr[i] + j)代表为第i行下标为j的元素
实际与二维数组同理。可以用
printf("%d ",arr[i][j]);
这样一种写法模拟出了一个二维数组