LinuxC学习日常——指针

来源:互联网 发布:开机显示便签损坏 知乎 编辑:程序博客网 时间:2024/06/05 03:17

1、指针变量的定义

int a;

int *p = &a;

* 表示这个变量是一个指针,int代表这个指针所指向的地址中保存的数据的类型,也可以是char、double等类型,但必须和指针所指向的地址中保存的数据类型一致。

指针变量中保存的是地址,所以必须将a的地址赋值给指针变量p。


2、指针变量的大小

指针变量的大小只与编译器的位数有关,由于指针内部存的是地址,32为情况下地址都是32位的,所以在32位的编译器下指针都是4个字节,在64位编译器下则是8个字节。


3、指针变量的取值

在变量定义时 * 号代表该变量为指针变量,在使用指针变量时*号代表取指针所指向的那块内存的值也就是说 *+地址 表示指针指向的那块内存的值。

#include <stdio.h>
int main(){int a = 10;int b = 20;int *pa = &a;int *pb = &b;// 通过 pa 与 pb 交换 a 与 b 的值int tmp = *pa;*pa = *pb;*pb = tmp;return 0;}

4、数组指针

指向数组的指针叫数组指针,数组名代表数组首个元素的地址

如:int a[5];

a = &a[0],&a是数组的地址要和数组首个元素的地址区分开。

数组名代表数组首个元素的地址,在某些场合可以当指针使用。

数组指针与数组的差异1:数组指针不能代替数组名求数组长度。(指针在32位编译器下永远是4个字节)

数组指针与数组的差异2:数组是一个常量不能改变。(不能出现数组名自加或者自减的情况)

#include <stdio.h>//指针方式逆序数组int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p1 = a;     // 指向数组的第一个元素int *p2 = a + sizeof(a)/sizeof(a[0]) - 1;while (p1 < p2){int tmp = *p1;*(p1++) = *p2;*(p2--) = tmp;}int i;for (i = 0; i < 10; i++){printf ("%4d", a[i]);}printf ("\n");return 0;}

5、字符串指针

字符串指针的使用方法和数组指针差不多,字符串指针是用来指向字符串数组或者字符串常量的。

#include <stdio.h>#include <string.h>int main1(){char ch[] = "hello";char *pch = ch;printf ("%s\n",pch);int i;for (i = 0; i < strlen(ch); i++){printf ("%c", *(pch+i));}putchar ('\n');puts(pch);char str[10];char *pstr = str;scanf ("%s", pstr);puts(str);return 0;}
典型错误1:将一个字符串写到一个没有初始化的指针位置即野指针。

典型错误2:用指针去修改一个字符串常量的值。

一个字符串常量可一代表这个字符串的首地址,可以用 char* 类型的指针指向它。


#include <stdio.h>//句子逆序#include <string.h>int main(){// char *p = "I am from shanghai";// char str[] = "I am from shanghai";char str[] = "you are from shanghai";// 将整个字符串逆序char *p1 = str;char *p2 = str + strlen(str) - 1;char *p3 = NULL;  // 用于将单词逆序char tmp;while (p1 < p2){tmp = *p1;*(p1++) = *p2;*(p2--) = tmp;}puts(str);// 再将每一个单词进行逆序,单词通过空格去找p1 = str;p2 = str;while(*p2) // p2找到字符串结束为止{if (*p2 == ' ') // 找到一个单词,要将前面的单词进行逆序{p3 = p2 - 1;while (p1 < p3){tmp = *p1;*(p1++) = *p3;*(p3--) = tmp;}p1 = p2 + 1;}p2++;}p3 = p2 - 1;while (p1 < p3){tmp = *p1;*(p1++) = *p3;*(p3--) = tmp;}puts(str);return 0;}

6、指针数组

一个数组,数组内的每个元素都是指针。


7、二维数组指针

int a[3][5]

int (*p)[5] = a;







原创粉丝点击