C语言指针
在上学的时候学C,指针算是学的最懵逼的一节了吧。每次编程碰到指针都是一脸懵逼,完全不知道在干嘛
一、什么是指针变量
指针变量:用来存储地址的变量。有了地址,就可以用来访问变量了。至于c为什么要引入指针,百度说的挺详细的。
二、定义
数据类型 *变量名;
三、如何用指针访问变量
int a,*p;
a = 3;
p = &a;//将p指向a变量【必须加&,指针只能存储地址,不能将其他数据类型放到其中】
p 取值操作,当然有些情况是不用,也是能够取值得。
printf("%d",*p); //3
*p = 100; [指针的存操作,直接改变了a变量的值]
printf("%d",a); //100
例外情况
int a[3] = {1,2,3};
p = a;//这是不用&,因为数组名本身就是一个地址 完全等价于 p = &a[0];
printf("%d",*p);//取到了数组的第一个元素
四、指针与数组千丝万缕的关系
p+1 的含义:即指针往后移动一个地址,移动的字节数是不确定,根据数据类型而定,比如INT 就往后移动4个字节
结论:指针P+1 = 指针P + sizeof(指针的类型) * 1
那么就有 :
p = a === a[0]
p+1 === a[1]
p+2 === a[2]
p+i === a[i]
取值时: *(p+i) 就等价于 a[i]喽;
五、【*p++ *(p++) (*p)++】 的关系
优先级:() 大于 * 大于 +
所以呢:
p++ => 先取出p[这时候已经取到了变量的值了],在对这个结果+1
*(p++) => 因为括号优先级高,先执行(p++):即指针往后移动一个地址,最后在取移动后的变量值
两者因为优先级的问题,导致一开始的操作对象是不一样的。
看个例子,重点
#include<stdio.h>
int main(){
int a[3]={1,8,3},*p;
p = &a[0];
printf("a=%d\n",*(p++)); // 1 () > * ,所以先执行p++,但p++是先用后加,这时候,p还没指向下个地址,然后执行*p,得到还是数组的首个元素1
printf("a=%d\n",*p);//8 因为上一个语句的p++,导致p执行下个地址,所以获得数组的第二元素8
p = a;//指针重新指向数组起始地址
printf("a=%d\n",*p++);//1 * > +;所以先执行*p,得到1;后执行p++,p指向了数组的第二个元素
printf("a=%d\n",*p);//8 这时p已经指向第二元素的地址了
p = a;
printf("a=%d\n",(*p)++);//1 () > + 先执行*p,得到1,之后1+1 = 2;【注意这时候是值加一,而不是指针移动了】
printf("a=%d\n",*p);//2 打印就是2了
p = a;
printf("a=%d\n",++(*p)); // 2 这个情况就是++a 与 a++的区别啦
printf("a=%d\n",*p); //2
return 0;
}
六:指针与字符串
char *x;
x = "hello world";
printf("%c\n",*(x+1));//e
printf("%s",x);//hello world
同样p+1,也是同样移到下一个地址
char *p = “hello”; 与 char p[] = “hello”;的区别
第一个是定义了一个字符型指针,指向了常量区是不能够修改的。
所以例如这样的操作(*p = *q)是错误的!!!
而第二个是普通数组变量,放在栈中,可以修改。
七、指针作为函数参数和数组名作为函数参数****
- 指针作为函数参数【即中所谓的引用】
好处:能够直接在函数改变变量的值,解决一个函数只能返回单个值的问题。
例子:角色互换 - 数组名作为函数参数
- 指针名是一个变量,而数组名是一个常量。差别就在这里。
我们也可以将数组名作为函数参数,并且在调用函数中,能够访问,还能够直接改变它的值。
所以,
int sum (int a[],int n); int sum(int *a,int n)
int a[] 等价于 int *a;
写个例子。
#include<stdio.h>
int main (){
void sumArray(int a[],int n);
void sumPointer(int *a,int n);
int n=5,i;
int a[5] = {1,2,3,4,5};
sumArray(a,n);
for(i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
sumPointer(a,n);
for(i=0;i<5;i++){
printf("%d ",a[i]);
}
return 0;
}
/**
* 数组作为函数参数
*/
void sumArray(int a[],int n){
int i,j,t;
j = n -1;
for(i=0;i<j;i++){
//jiaohuan
t = a[i];
a[i] = a[j];
a[j] = t;
j--;
}
}
/**
* 指针作为函数参数
*/
void sumPointer(int *a,int n){
int *start,*end,t;
end = a+n-1;//将指针指向末尾
for(start=a;start<end;start++){
t = *start;
*start = *end;
*end = t;
end--;
};
}
在linux搭建php环境:https://study.163.com/course/introduction/1209187856.htm