一,指針
1.地址
內存單元的編號叫地址;
2.指針
內存單元的地址叫指針;
變量的地址叫指針;
3.指針變量
存儲變量地址的變量叫指針變量;
說明:
在不作區分的情況下,將地址指針指針變量統稱指針;
4.指針變量的形式
存儲類型數據類型*指針變量名;
例如:
int * p;
說明:
存儲類型:同普通變量,指針變量本身的存儲類型;
數據類型:既可以是基本類型,也可以是struct,也可以是void,還可以是指針;
此數據類型是指針指向空間內容的數據類型;(重點)
*:表示變量爲指針變量;
指針變量名:符合命名規則;
指針變量的初始化
存儲類型數據類型*指針變量名=地址值; eg1
:
int i = 10;
int * p =&i; //由於p指針指向的數據爲int型,所以需要給指針變量putr int型變量的地址; eg2
:
char ch ='a';
char * q =&ch;
6.&與*
&:取變量的地址
*:
1>在定義指針變量時,*用來說明定義的變量爲指針變量;
例如:
float * p; // *說明定義的變量p爲指針變量;
2>在定義之後,指針變量名前加*,含義是取指針指向空間的值;(解引用)
例如:
int i = 10;
int * p;
p =&i; //給指針變量p賦i的地址
printf(“i =%d * p =%d \ n”,i,* p);
注意:
&與*互爲逆運算;
例如:
int i = 10;
的printf(”
7.指針的運算
本質:地址的運算
定義指針變量px和py;
1>算數運算:(+ - ++ - )
px + n:指針向地址大的方向偏移n個數據類型;(此數據類型爲指針指向內容的數據類型)
px-n:指針向地址小的方向偏移n個數據類型;(此數據類型爲指針指向內容的數據類型)
px ++://等價:px = px + 1;指針向地址大的方向移動1個數據類型;(此數據類型爲指針指向內容的數據類型)
px--:指針向地址小的方向移動1個數據類型;(此數據類型爲指針指向內容的數據類型)
PX-PY:兩指針之間相差的數據類型的個數;
例如:
int a [10] = {1,2,3,4,5,6,7,8,9,10};
int * p =&a [0]; //
int * q =&a [7];
printf(“p =%p p + 3 =%p \ n”,p,p + 3); // p = 0xbffb8334 p + 3 = 0xbffb8340
printf(“q =%p q-3 =%p \ n” ,q,q-3); // q = 0xbffb8350 q-3 = 0xbffb8344
printf(“qp =%d \ n”,qp); // qp = 7
注意:
n爲整數
2>關係運算(> <> = <= ==!=)
eg1:
int * p; //“野指針“
* p = 10; //不允許通過野指針訪問野指針指向的空間; eg2
:
int * p = NULL; // stdio.h定義的宏值#define NULL 0
if(NULL == p)/ /判斷指針是否爲有效的指針
{
return;
}
* p = 10; //錯誤
3>賦值運算eg1
:
int i = 10;
int * p =&i;
eg2:
int i = 10;
int * q = p;
eg3:
int a [10];
int * p = a;
二,指針與數組
通過指針操作數組;
1,一級指針與一維數組
例如:
int a [10] = {1,2,3,4,5,6,7,8, 9,10};
int * p = a; // int * p =&a [0];
int i;
for(i = 0; i <10; i ++)
printf(“%d”,a [i]);
的printf( “\ n”);
for(i = 0; i <10; i ++)
printf(“%d”,p [i]);
printf(“\ n”);
結論:
1> 數組中第i個元素的表示:(i = 0,1,2,.....)
a [i] p [i] *(a + i) *(p + i)*(&a [i])*(&p [i])
2>
&a [i]&p [i](a + i)(p + i)
三, 字符指針
1.形式
存儲類型char *指針變量名; eg1
:
char ch ='a';
char * p =&ch; //
* p ='b';
的printf( “* P =%C \ n”,* P);
eg2:
字符指針操作字符串(重點)char * p =“hello world”; //將字符串的首地址賦予p指針
printf(“* p =%c \ n”,* p); // * p ='h'
* p ='a'; // ERROR不能通過指針修改常量區的東西
例子:
char * p;
p =“你好世界”;
printf(“* p =%c \ n”,* p); // * p ='
h'printf(“p =%s \ n”,p);
char * p = NULL;
p =“你好世界”;
eg4:
char ch [20] =“hello world”;(√)
char ch1 [20];
ch1 =“hello world”;(×)//數組名不能作爲左值
eg5:
char ch1 [20];
ch1 [20] =“hello world”;(×)// ch1 [20]表示的是數組ch1中的第21個元素,越界
eg6:
char ch [20] =“hello world”; //將常量區的“hello world”拷貝貝份到ch的空間
* ch ='a';
printf(“%s \ n”,ch); //結果:aello world
實例:
1,求一個字符串的長度。(指針)
的#include <stdio.h>中
int main()
{
char ch [64];
得到(CH);
int num=0;
char *p = ch;
while(*p != '\0')
{
num++;
p++;
}
printf("num=%d\n",num);
return 0;
}
2、計算一個字符串的空格數,並刪除全部空格;
#include<stdio.h>
int main()
{
char a[64];
gets(a);
int i,j,num=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i] == ' ')
{
num++;
for(j=i;a[j]!='\0';j++)
a[j] = a[j+1];
i--;
}
}
printf("num=%d %s\n",num, a);
return 0;
}
3、用指針給一個數組賦值,並打印。
#include<stdio.h>
int main()
{
int a[10];
int len = sizeof(a) / sizeof(int);
int *p = a;
int i;
for(i=0;i<len;i++)
scanf("%d",p++);
p = a;
for(i = 0; i <len; i ++)
printf(“%d”,p [i]);
的printf( “\ n”);
返回0;
}