1.指针赋值
①
int i , *p , *q;
p = &i;//p获取i的地址
q = p;//指针变量p把地址拷贝给指针变量q
*p = 1;//改变i的值为1
*q = 2;//改变i的值为2
②
int i , j , *p , *q;
p = &i;//指针变量i获取i的地址
q = &j;//指针变量q获取j的地址
i = 1;//给i赋值为1
*q = *p;//把指针p的值拷贝给指针q
printf(“%d %d
”,*p,*q);//输出
2.指针与一维数组
①数组名代表数组的首地址,是一个地址常量,即数组首元素地址
示例:
void printfMaxValueOfArray(int array[] , int count);
void printfMaxValueOfArray(int array[] , int count){
int max = 0;
for(int i = 0 ; i < count ; i ++){
if(max < array[i]){
max = array[i];
}
}
printf(“max = %d”,max);
}
int main(){
int number[] = {10,20,15,3,8,9,100};
printfMaxValueOfArray(number,sizeof(number) / sizeof(number[0]));
}
②数组作为函数参数的时候,其实传递给函数的数组的首地址
示例:
void printfArray(int *arr , int count);
void printfArray(int *arr , int count){
for(int i = 0 ; i < count ; i ++){
printf(“%d ”,arr[i]);
}
}
int main(){
int number[] = {10,20,15,3,8,9,100};
printfArray(number,sizeof(number) / sizeof(number[0]));
}
③数组名不能被改变
④语法糖:array[n]: *(array + n)
⑤数组作为返回值会有风险
示例:
char *backString(){
char str[] = “Lanou”;
return str;
}
问题在于str的生命周期只在花括号,主函数中调取时,已经获取首地址。执行完,内存即被释放,获取的首地址调用的是其他的内容。
3.指针与二维数组
4.指针与字符串
①指针与字符串类似于指针与数组的概念
②字符指针可以操作单个字符,也可以操作整个字符串
③%s格式控制符的作用:printf函数的格式串中如果包含%s格式控制符,择需要对应一个指针,函数内部会循环对指针做移位运算来得到每一个字符,直到遇到字符串的结束标识符’ ’结束。
④字符串与字符数组的区别是差一个’ '
示例:
char strArray[] = “iPhone6”;
//strArray[6] = ‘7’;
char *s = strArray;
*s = ‘o’;//s[0] = ‘o’;
printf(“%s
”,s);
⑤使用sizeof计算字符串长度
示例:
char sa[] = “iPhone”;
char *st = “iPhone”;
//如果对数组名sizeof,返回值就是所有数组元素所占字节数
printf(“%ld
”,sizeof(sa));
//如果对指针sizeof,返回值就是指针所占字节数(8个字节)
printf(“%ld
”,sizeof(st));
⑥注意存储位置
《1》iPhone是常量字符串,存放在常量区(不可改)
《2》str是字符数组,存放在栈区(可改)
char *str = “iPhone6”;//只读,地址直接指向常量区,不可改
示例:
修改字符数组中的字符
void test(char *str , int count);
void test(char *str , int count){
int number = 0;
while(*str != ‘ ’){
if(*str == ‘a’){
*str = ‘A’;
number ++;
}
str ++;//指针++,一次移动一个类型那么长的距离
}
}
5.指针与字符串数组
6.指针与结构体
①指向结构体变量的指针,称为结构体指针
typedef struct person{
char name[20];
int age;
}person;
int main(){
person p1 = {“贝爷”,30};
person *ps = &p1;
ps->age = 40;
//使用指针获取结构体变量中的成员变量
(*ps).age = 35;//注意运算符的优先级
printf(“%d
”,(*ps).age);
strcpy(ps->name , “Liuwa”);
printf(“%s
”,ps->name);
}
②语法糖:(*ps).name: ps->name(高级用法)
③ps是结构体指针,存放结构体变量第一个成员的地址
④*ps是整个结构变量
7.指针与结构体数组
//结构体数组
person pArr[3] = {{“A”,10},{“B”,20},{“C”,30}};
for(int i = 0 ; i < 3 ; i ++){
printf(“%s %d
”,pArr[i].name,pArr[i].age);
}
//结构体指针
person *pas = pArr;
for(int i = 0 , i < 3 ; i ++){
printf(“%s %d
”,pas[i].name,pas[i].age);
}
for(int i = 0 ; i < 3 ; i ++){
printf(“%s %d
”,(pas + i)->name,(pas + i)->age);
}
①语法糖:(pas + i)->age:pas[i].age(高级用法)
8.指针与函数
①使用指针作为函数,可以实现在函数内部改变函数外部变量的值
②函数传参的过程:把实际参数的值拷贝到形式参数
③注意传值和传址
示例:
交换a和b的值
void swap(int *x , int *y);
void swap(int *x , int *y){
int temp = *x;
*x = *y;
*y = temp;
}
int main(){
int a = 10 , b = 8;
swap(&a,&b);
printf(“a = %d , b = %d
”,a,b);
}
④函数
返回:int float double 算数居多
返回:BOOL 判断状态
返回:指针 分配内存或者操作内存
返回:字符串 char *
⑤参数的作用
《1》提供数据
《2》参数 + 指针 = 返回多个结果
《3》指针作为参数返回多个结果
示例:
void back(int *n1 , int *n2){
*n1 = 20;
*n2 = 10;
}