C 指针
&:
不能取常数的地址 &10 是错的
#include <stdio.h>
int main()
{
int i=100;
int* p;
p=&i;
//&i的类型:在i类型的基础上再加一个*
//p不能保存常量地址
}
#include <stdio.h> int main() { int i=2; printf("0x%p\n",&i);//&i 取变量i的地址 int suzu[5]={10,20,30,40,50}; printf("0x%p\n",&suzu); //取数组首地址 printf("0x%p\n",suzu); //取数组首地址 printf("0x%p\n",&suzu[0]); //取数组首地址 //以上三个地址是相等的 printf("0x%p\n",&suzu[1]); int *p=&i; //定义指针 //指针变量是用来保存变量地址的 //p指向变量i int *q,*qq; //定义了两个指针 int a=99; int *pp=&a; int x=*pp; //返回指针pp指向的a变量的值---取地址中的值 //[返回变量的值] [*pp相当于a]; *pp=88; //修改变量a的值--修改地址中的值 return 0; }
#include <stdio.h> int main() { int i=20; int * const p =&i; //定义一个const指针 //p保存的地址不能被修改 *p=26; //正确 printf("%d",*p); //p++; //错误 const int *pp=&i; //不能通过*p来修改数据 //*PP=99; 错误 int const *p=&i;//与 const int *pp=&i 一样 //const在*的前面 能通过*p来修改数据 //const在*的后面 指针保存的地址不能被修改 return 0; }
结构体指针:
#include <stdio.h> typedef struct student { int age; int achievement; } Student; int main() { Student stu={18,88}; Student *p=&stu; printf("%d\n",stu.age); printf("%d\n",p->age); //用指针取值 p->age=28; //利用指针修改值 printf("%d\n",p->age); printf("%d----%x\n",p,p); p++; //增加一个结构体的字节数 printf("%d----%x\n",p,p); return(0); }
数组与指针:
#include <stdio.h> //void hansu(int *a){ void hansu(int a[]){ //数组作为参数时,形参与实参是传址 //形参a实际接收的是实参数组的首地址---a实际是指针 //上面两句的效果是一样的 int x=sizeof(a);//参数数组的sizeof返回的是首地址的大小,不是数组元素的总个数;一般需要传递数组的长度 printf("%p\n",a); } int main() { int b[5]={10,20,30,40,50}; int x=sizeof(b); //返回数组元素的总个数 printf("%d\n",x); printf("%p\n",b); //b实际就是指针(常量指针) hansu(b); return 0; }
int a[]={10,20,30,40,50}; int *p=a; printf("p=%p\n",p); printf("p+1=%p\n",p+1); //p=000000000062FE00 //p+1=000000000062FE04 //指针+1时,就是+sizeof(a[0]) ,就是+数据元素的字节数,就是移到下一个元素 //两个指针相减=间隔的元素个数
int* p[5] 与 int(*p)[5] 的区别:
int p[5] :p是指针,指向一个数组(第一个元素地址),数组中每个元素的类型是int
int* p[5]:p是指针,指向一个数组,数组中每个元素的类型是int类型的指针
int(*p)[5]:数组指针
#include <stdio.h> #include <string.h> int main() { int a[5]={1,2,3,4,5}; int (*p)[5]; //一维数组指针 //p是指针,指向一个空间(空间的大小5个int) p=(int (*)[5])10; //赋值 p=&a; //赋值 int x=(*p)[0]; //取值 //*p相当于a printf("%d\n",x); printf("%p---%d\n",p,p); p++; //自增整个数组空间 printf("%p---%d\n",p,p); int arr[3][3] ={{10,20,30},{40,50,60}}; int (*pp)[3]=&arr[0]; //arr[0]={10,20,30} x=(*pp)[0]; printf("%d\n",x); // x=10 pp++; x=(*pp)[0]; printf("%d\n",x); return(0); }
函数指针:
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
typedef int(*pfunc)(int a, int b);//声明函数指针数据类型
int main()
{
//方法一
int(*p)(int, int) = add; //定义了一个函数指针
//格式:返回类型 (*指针变量名)(参数列表);
int x = p(100, 10);//利用指针调用函数
//方法二
pfunc pf;//创建一个函数指针
pf = sub; //使函数指针指向add函数
x = pf(20, 30);
printf("%d\n", x);
return(0);
}
返回指针:
int s;
int* add(int a, int b) //返回值类型是指针
{
s = a + b;
return &s; //返回指针
}
int main()
{
int* p;
int a = 100;
int b = 10;
p = add(a, b);
cout << p << endl;
cout << *p << endl;
}
++ --的算法:
#include <stdio.h> int main() { char* a=(char*)100; short* b=(short*)100; int* c=(int*)100; printf("%d %d %d\n",a,b,c); a++; b++; c++; //带*变量的++(--): 自增(自减)去掉一个*之后类型占用的字节数 //不带*变量的++(--): 自增(自减)1 printf("%d %d %d\n",a,b,c); }
取值运算符:
#include <stdio.h> int main() { //取值运算符:*+指针类型变量 int i=20; int* p=&i; int x=*p; //获取地址中的值 //获取值的类型:指针p类型去掉一个*后的类型 printf("%d\n",x); }
p[n]=*(p+n) p[0][0][0]=***(p) p[1][2]=*(*(p+1)+2)
利用二级指针实现字符串的交换:
#include <iostream> #include <string.h> using namespace std; int main() { char str1[] = "李明"; char* pa = str1; char str2[] = "liming"; char* pb = str2; cout << pa << endl; char** p1 = &pa; char** p2 = &pb; pa = *p2; pb= *p1; cout << pa << endl; return(0); }