指针
1. 指针变量的定义
格式:变量类型 *变量名;
int *p; 定义了一个指针变量p,指针变量只能存储地址。
指针变量的作用:能够根据一个地址值,访问对应的存储空间
指针变量p前面的int表示指针变量p只能指向int类型的数据
指针变量未经过初始化,不要拿来间接访问其他存储空间
2. 指针的写法:
int *p;
int a = 90;
p = &a; //正确,指针变量p指向了变量a
int *p;
double d = 10.0;
p = &d; //错误,int *p只能指向int类型的数据
int *p;
p = 200; //错误,指针变量未经过初始化,不要拿来间接访问其他存储空间
3. 用指针传递参数,交换实例
1> 不能交换外面实参的值,仅仅是交换了内部指针的指向
void swap(int *v1, int *v2)
{
int *temp;
temp = v1;
v1 = v2;
v2 = temp;
}
2> 完成两个整型变量值的互换
void swap(int *v1, int *v2)
{
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
3> 交换的只是内部v1、v2的值
void swap(int v1, int v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
指向指针的指针
int a = 10;
int *p = &a;
int **pp = &p; //指向指针p的指针
int ***ppp = &pp //指向pp的指针
a = 10; *p = 10; *(*pp) = 10; ***ppp = 10;这四个是相同的。
p = NULL; //清空指针后,不能再间接访问其他存储空间
指针和数组
1. 数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2. 指针变量加1,地址值加多少,取决于指针的类型
int * 4
char * 1
double * 8
3. 利用指针来接收一个数组,指针变量arr指向了数组的首元素
void Show( int *arr) //获取的是数组的首元素 sizeof(arr) = 4
{
printf(“%d\n”,arr[2]);
printf(“%d\n”,*(arr+2));
}
int main()
{
int a[] ={1,2,3,4};
Show(a);
return 0;
}
指针和字符串
1. 定义字符串的两种方式:
1> 利用数组
char name[] = "Jack";
*特点:字符串里面的字符是可以修改的
*使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "Jack";
*特点:字符串是一个常量字符串,里面的字符是不可以修改的
*使用场合:字符串的内容不需要修改,而且这个字符串经常使用
2. 实例:编写一个函数 int my_strlen(char *s),返回字符串s的长度(不包括'\0')
int my_strlen(char *s)
{
int len = 0;
char *ptr = s;
assert(s != NULL);
while(*ptr++ != '\0')
len++;
return len;
}
3. 指针数组
char *name[5] = {"Jack", "Rose", "Jay"};
char name[5][10] = {"Jack", "Rose", "Jay"};
返回指针的函数
返回指针的函数的一般形式为:类型名 *函数名(参数列表); 例如:
char *test()
{
return "Jay";
}
int main()
{
char *name = test();
printf("name = %s\n", name);
return 0;
}
指向函数的指针
定义的一般形式为:函数的返回值类型 (*指针变量名)(形参1, 形参2, ....);
1. (*p)是固定写法,直接表明指针变量p将来肯定是指向函数
void (*p)(); void表明指针变量p指向的函数没有返回值,右边的括号表示指针变量p指向的函数没有形参
2. int (*p)(int, int); 左边的int表示指针变量p指向的函数返回int类型的数据,右边的(int, int)表示指针变量p指向的函数有两个int类型的形参