二、指针
1. 定义
变量类型 *变量名 int *p p = &变量名
指针变量只能存放地址,指针就是通过地址访问相应地存储空间,从而操作存储空间内的数据。通过%p输出指针里存储的地址值
2. 注意
1> int *p;
double a = 3.0;
p = &a;
指针p只能指向int类型的数据
2> int *p;
p = 10;
指针变量只能存地址
3> int *p;
printf(“%d\n”,*p);
未经初始化的指针,不能访问存储空间
3. 所有类型的指针,在64位编译器环境下,都占用8个字节的存储空间,而为指针定义类型,与指针所占空间没有关系,指针的类型为了取出存储空间的数据时,应该取出多少字节的数据。
4. 指向指针的指针
int main(){
int a = 10;//假如a的地址ffc0
int *p = &a;// p = ffc0,*p = 10而p的地址并非ffc0,假设为ffc5
int *pp = &p;// pp = ffc5指向指针p的空间,*pp = *p = 10
*pp =20;
printf(“%d\n”,a);//通过指针pp间接修改a的值,输出为20
}
三、 指针与数组
1. 定义
int ages[5] = {20,25,27,29,30};
int *p;
p = &age[0] ⇔ p = ages;//数组首元素、数组名即数组的地址,p指首元素
2. 利用指针遍历数组元素
p→ages[0]
p+1→ages[1]
p+2→ages[2]
p+i→ages[i]
for (int i = 0; i<5; i++)
{
printf("ages[%d] = %d\n", i, *(p+i));
}
//指针变量+1,地址加多少取决于指针的类型
int * +4; char * +1; double * +8;
四、 指针与字符串
char name[] = “jack”;//字符串变量
//指针变量name1指向字符串的首字符
char *name 1=”andy”;//字符串常量,不可改
指针数组:char *name[2] = {“jack”,”andy”};
注意:1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
习题:编写一个int string_len(char *s),返回字符串s的字符长度
#include <stido.h>
int string_len(char *s);
int main()
{
int size = string_len("andy22");
printf("%d\n", size);
return 0;
}
int string_len(char *s)
{
// 记录字符的个数
int count = 0;
// 如果指针当前指向的字符不是'\0'
// 首先*s取出指向的字符
// 然后s++
while ( *s++ )
{
// 个数+1
count++;
// 让指针指向下一个字符
//s = s + 1;
s++;
}
return count;
}
五、 指向函数的指针
1. 定义
函数返回值类型 (*指针变量名) (形参);
void (*p) ();
2. 注意
函数名代表着函数的地址
指针变量p存储函数的入口地址,所以p++是无意义的
void tset
{
}
int main()
{
void (*p) ();
p = test;//函数名即地址,p指向test函数
//间接调用函数
p();
(*p) ();
return 0;
}
|
|