您的位置:首页 > 编程语言 > C语言/C++

《IOS_C语言》指针

2015-08-29 19:53 357 查看
一:指针变量的定义和使用

(1)定义:int *p 指针变量为p,类型为" int * "整型指针,char */short*等都会有的,虽然有类型修饰符,但指针所占的字节由系统决定的,32位的系统占4字节,64位的占8字节

指针是存放内存地址的变量

printf("p=%p\n",p);//打印的是指针p的地址

(2)取址运算符&:

int a=3;

int *p=&a;

printf("&a=%p\n",&a);

printf("p=%p\n",p);

上面打印的两个地址都是一样的

(3)取值运算符*

int a=3,b=5;

int *p=&a;

printf("%d\n",*p);

p=&b;这里是指针的重新指向

*p=100;这里是通过指针来改变b的值

printf("%d\n",b);

(4)指针的算术运算

//指针的算术运算:指针的加法运算会有溢出,没意义,而减法就是两个地址的差值,即是内存空间。只有自增、自减和减法运算

int * p = &a;

!

p++; //向⾼位移动四个字节

!

p--; //向低位移动四个字节

课上代码验证

//打印出本电脑64位的一个指针的所占的字节数

int *p= NULL;

char *p= NULL;//即使是char型都一样是8字节,等于64位

printf("%lu\n",sizeof(p));

printf("%p\n",p);

p++;//往高位移动(int *p,int:四个字节,char *p,char:增加一个字节)

printf("%p\n",p);

p--;//往低位移动(int:四个字节,char:减少一个字节)

printf("%p\n",p);

int a=3,b=5;

int *p=&a;//指针一定赋值的是&地址

//指针变量p的类型修饰符是"int *",指针变量所占的字节数只与操作系统有关(int/char/short/float *p)也都是4或8字节(32位是4个,64位是8个字节)

//(1)取值符号*

printf("%d\n",*p);//这两种输出的值都一样

printf("%d\n",*(&a));

//(2)下面的取这两个地址值是一样的

printf("%p\n",p);//输出的地址都是ox7fff5fbff7dc地址

printf("%p\n",&a);

//(3)取地址符号&

//相对于上面*p=&a而言,下面是重新指向&b,则指针就会被后者覆盖掉

p=&b;//指针变量p把b的地址拿过来,并且b=5的值也会随之而拿过来,则输出的是地址,加上*就是取值了

printf("%d\n",*p);

//下面的两种方法达到相同的修改值的效果

// b=100;//直接方法

*p=100;//间接方法

//再次重新指向,指针变量p把100的值拿过来,则指针变量p拿过来的b地址的值就会等于100,则输出的b=100也是值

printf("%d\n",*p);

printf("%d\n",b);

二:指针与数组

数组名就是数组元素的首地址,因此

a[3]={1,3,4};

int*p=a;//这里指针指向数组的地址,也就是a[0]的地址

并且指针可以当数组名使用,因此有p[1]=a[1]=*(p+1)=*(a+1)

//如下:验证数组名就是指针,也就是数组首个元素的地址

int array[]={1,3,2,4};

printf("%p\n%p\n",array,&array[0]);

指针与数组的区别:

//指针变量可以重新指向,但是数组名不可以重新指向,因为他是常量指针,不可以重新指向,也不可以自增自减array++,从开始定义时他的地址就定下来常量,但可以array+1/-1;由于是整型的int则地址指向下一个地址array[1];

printf("%d\n",array[0]);//array[0]=1

printf("%d\n",array[1]);//array[1]=3

*(array+1)=100;

printf("%d\n",array[1]);//array[1]=100

//访问一个数组的元素的三种方法:

//(1)array[i]数组下标法 如printf("%c\n",string[1]);

//(2)*(array+i)数组移位法 printf("%c\n",*(string+1));

//(3)指针p[i]指针下标法 printf("%c\n",p[1]);

//(4)指针*(p+i)指针递增移位法 printf("%c\n",*(p+1));

char string[10] = {'i','P','h','o','n','e'};

//string

//为数组名,同时也是数组的⾸首地址。

char *p= string;

printf("%c\n",*p);//*p=string[0]

//*(p+1)=string[1]=p[1]=*(string+1)

printf("%c\n",*(p+1));//*(p+1)=string[1]

printf("%c\n",*(string+1));

printf("%c\n",p[1]);

printf("%c\n",string[1]);

short a[4] = {3 , 7 , 9 , 1};

//short占2个字节,则每个元素用16位来保存,并且从低位往上存起

int *p1 = a;

//int 占4个字节,读第一个元素也该是4个字节,也就是3和7的总32位二进制码的值,并且先读取7,再读取3的二进制码,则总的就是等于458755

char *p2 = a;

//char占一个字节,则只读取第一个字节的值恰好是00000011=3

printf("%d\n",*p1);

printf("%d\n",*p2)

三:指针与字符串

//指针与字符串

char string[] = "iPhone";//实际上是变成了string[]={'i','P','h','o','n','e','\0'}

//string为数组名

char *q="iPhone";

//q的地址跟"iPhone"地址一样,p与string的地址一样

char *p = string;

//指向字符数组⾸首地址string[0],但是输出的是整个字符串

// char *p = "iPhone";//不可以修改*(p+1) ='v';,不然会出错

//操作单个字符

*(p+1) ='v';//使得数组的string[1]重新=‘v’,原本的字符串并没有改,改的只是string[]里面复制版的值

//输出字符串的方式:printf("%s",指针名p/或者数组名string)

printf("%s\n",p);//输出为ivhone字符串

printf("%s\n",string);//输出为ivhone

// 通过指针计算字符串的长度(用到的知识点:)

//(1)array[i]数组下标法 如printf("%c\n",string[1]);

//(2)*(array+i)数组移位法printf("%c\n",*(string+1));

//(3)指针p[i]指针下标法 printf("%c\n",p[1]);

// (4)指针*(p+i)指针递增移位法printf("%c\n",*(p+1));

char *q="abk jdh";

int count=0;

while (*(q+count)!='\0') {

count++;

}

printf("%d\n",count);

四:指针数组

//指针数组

char *strings[3] = { "iOS", "Android", "Win8"};

//数组指针*(strings[3])=*strings[3]

//指针数组(*strings)[3]

for (int i=0; i<3; i++) {

printf("%s\n",strings[i]);

}

注意:可以⽤用指针修改字符数组,但不可修改常量字符串

五:指针与函数

指针作为参数,实现两个数的值交换的函数

//交换两个实参数,必须要用指针

//jiaohuan(&a,&b);//把地址(连带数值)传送进去

void jiaohuan(int*a,int*b)//传送指针,交换地址

{

int temp=*a;

*a=*b;

*b=temp;

}

int main(int argc, const char * argv[]) {

//交换两个数

int a=4;

int b=5;

jiaohuan(&a,&b);//把地址(连带数值)传送进去

printf("a=%d,b=%d\n",a,b);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: