C/C++指针深析

C/C++指针深析

指针对于初学者往往是很难以琢磨的东西,因为它并不如变量那么抽象,而是更贴近底层的真实结构。指针操作往往会出现各种各样的岔子,最常见的便是”segmentation fault”。所以这里辨析了各种指针类型,实践出真知,下面的例子如果自己敲下来就更好了

const修饰指针

#include 

using namespace std;

class Rectangle{
  public:
  Rectangle(int length, int width){chang=length; kuan=width;}
    void SetLength(int length){ chang=length;}
    int GetLength() const{ return chang;}
  private:
    int chang;
    int kuan;
};

int main(){
  // int a=123;
  // const int *p=&a;//const 修饰*,p可以改
  // cout<<*p<GetLength()<GetLength()<GetLength()<GetLength()<SetLength(789);//非const方法也可以调用
  cout<GetLength()<

一维数组指针的区别

a代表首地址,在sizeof和&a时当成了数组整体

#include 
using namespace std;
#define sz(type) cout<

二维数组指针的区别

注意与一维指针类比区别开来。

指针有减法和比较运算,没有加法运算。

#include 
using namespace std;
#define sz(type) cout<

指针作为函数的参数

使用swap(交换两个变量的值)作为演示,实现Swap的四种方法。当数组名作为函数的参数来传递的时候,他的高贵的数组结构特性已经失去了,成了一个地地道道的只拥有4个字节的平民。

#include 
using namespace std;
#define SWAP(a, b, temp) (temp=a, a=b, b=temp);
void func(int *x, int *y){
  int z=*x;
  *x=*y;
  *y=z;
}
void func1(int &x, int &y){
  cout<
void Swap(T &a, T&b){
  T temp=a;
  a=b;
  b=temp;
}
int main(){
  float a=12.1, b=13.2;
  cout<

指针作为返回值

要作为返回值,必须保证调用后返回的指针不会销毁,否则就是野指针。

#include 
using namespace std;
int a[3];//全局变量默认初始化为0
int * func(){
  return a;
}
int main(){
  int a=1;
  cout<

字符数组指针

1、str和p是不相同的!!

#include 
#include 

int main() {
  char str[3]="ab";
  char *p=str;//此处可以修改str,因为str只是字符数组(使用了字符串字面量来初始化str),但是并不是常量
  size_t length = std::strlen(str);//遇到'\0'才会停止计数
  // 例如 char a[3]={'a', 'b', 'c'}, 使用strlen后的长度不是3!!!
  printf("%c-%s-%ld-%ld\n", *str, str, sizeof(str), strlen(str));
  // sizeof(str) 返回的是数组占用的内存大小,而 strlen(str) 返回的是字符串的长度。
  printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
  // sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
  *p='A';
  *(p+1)='B';
  std::cout<<*str<<*(str+1)<

2、此处会有一个warning,因为“ab”是存储在常量区域的,不能修改,在使用时需要使用const来申明

#include 
#include 

int main() {
  char *p="ab";// 先在常量区保存好"ab",然后在栈区建立一个char *
  //   const char *p="ab";
  printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
  // sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
  *p='A';
  *(p+1)='B';
  std::cout<<*p<<*(p+1)<

3、此处会显示error: assignment of read-only location ‘* p’

#include 
#include 

int main() {
  const char *p="ab";
  printf("%c-%s-%ld-%ld\n", *p, p, sizeof(p), strlen(p));
  // sizeof(p) 返回的是int型指针占用的内存大小,而 strlen(p) 返回的是字符串的长度。
  *p='A';
  *(p+1)='B';
  std::cout<<*p<<*(p+1)<

4、字符数组指针的初始化

#include 
#include 
using namespace std;
int main() {
  char a='a';
  char b='b';
  char *p=&a;

  char c[]={a, b, 'c'};
  printf("%p--%p--%c--%c\n", &a, &b, a, b);
  printf("%p--%p--%c--%c\n", c, c+1, *c, *(c+1));
  char *p2[]={&a, p, c};
  for(int i=0; i<3; i++){
    printf("%p--%p--%c\n", &p2[i], p2[i], *p2[i]);
  }
  return 0;
}

函数指针

主要要把指针括起来

#include 
using namespace std;
void func(){
  cout<<"func"<

函数指针数组

#include 
using namespace std;
void func(){
  cout<<"func"<

函数指针深度辨析

!!!!!!!!!!!!!

#include 
using namespace std;
void func(){
  cout<<"func"<

结构体内存对齐

#include 
using namespace std;

#define sz(type) cout<

结构体指针

#include 
#include 
using namespace std;

struct Stu{
  int a;
  char c[13];
};
int main(){
  Stu s;
  s.a=12;
  strcpy(s.c, "121");
  cout<a=11;
  strcpy(pStu->c,"qwe");
  cout<a<<"---"<c<

你可能感兴趣的:(c++,c++,c语言,算法)